2011-09-07 43 views
5

Tôi có một số vấn đề với giá trị băm SHA1 của một chuỗi. Tôi đang cố gắng để gửi một tập tin từ một khách hàng được viết bằng VB.net đến một máy chủ được viết bằng PHP. Vấn đề của tôi là khi tôi vượt qua cùng một chuỗi để VB.net và PHP, giá trị SHA1 tính bởi VB.net là hoàn toàn khác với giá trị tính toán bằng PHP.Cùng một chuỗi, giá trị băm SHA1 khác nhau thu được từ VB.net và PHP

Ví dụ: tôi muốn mã hóa chuỗi trong Base64 và sau đó tính giá trị Hash SHA1 của chuỗi Base64. Khi máy tính thực hiện nhiệm vụ này từ phiên bản vb.net và từ phiên bản PHP tôi nhận được hai giá trị SHA1 khác nhau, ngay cả khi có vẻ như chuỗi Base64 mã hóa là như nhau:

VB.net: 2E97A53B09C482A831540B532845BCAC79BFACCF PHP: 350A2080264E2724D4BCBC521C35264D264A1DAF

Tôi chắc chắn thiếu điều gì đó, bạn có thể chỉ cho tôi đúng hướng và cho tôi biết tôi đang làm gì sai ở đây không?

Thank you very much

Dưới đây là Bộ luật VB.net:

Dim cInput As String 
Dim cBase64 As String 
Dim objSHA1 As New SHA1CryptoServiceProvider() 
Dim abBytesToHash() As Byte 
Dim cHash As String 


cInput = "the quick brown fox jumps over the lazy dog" 
cBase64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(cInput)) 

abBytesToHash = System.Text.Encoding.ASCII.GetBytes(cBase64) 

abBytesToHash = objSHA1.ComputeHash(abBytesToHash) 
cHash = BitConverter.ToString(objSHA1.ComputeHash(abBytesToHash)) 
cHash = Replace(cHash, "-", "") 

MsgBox("BASE64: " + cBase64 + vbNewLine + "SHA1: " + cHash) 

' Result is: 
' BASE64: dGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw== 
' SHA1: 2E97A53B09C482A831540B532845BCAC79BFACCF 

Và đây là Bộ luật PHP:

$cInput = "the quick brown fox jumps over the lazy dog"; 
$cBase64 = base64_encode($cInput); 

echo("BASE64: " . $cBase64 . "<br />" . "SHA1: " . strtoupper(sha1($cBase64))); 

// Result is: 
// BASE64: dGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw== 
// SHA1: 350A2080264E2724D4BCBC521C35264D264A1DAF 
+2

mã hóa trên các chuỗi này là gì? –

+0

Hài hước rằng http://www.tools4noobs.com/online_php_functions/sha1/ cho 16312751ef9307c3fd1afbcb993cdc80464ba0f1 –

+0

@Captain: Không có, nó cung cấp cho '350a2080264e2724d4bcbc521c35264d264a1daf'. Các văn bản không được băm, mã hóa base64 của nó là (tại sao, tôi không có ý tưởng). – ircmaxell

Trả lời

6

Vâng, vấn đề là bạn đôi băm trong .NET và chỉ băm duy nhất trong PHP. Dưới đây là những gì bạn đang làm trong .NET được dịch sang PHP:

$cInput = "the quick brown fox jumps over the lazy dog"; 
$cBase64 = base64_encode($cInput); 

$sha = sha1($cBase64, true); // The true param returns the raw bytes instead of hex 
$chash = sha1($sha); 

Vì vậy, bạn đang băm đôi. Để khắc phục điều đó, bạn chỉ cần thay đổi thuật toán của bạn để:

cInput = "the quick brown fox jumps over the lazy dog" 
cBase64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(cInput)) 

abBytesToHash = System.Text.Encoding.ASCII.GetBytes(cBase64) 

cHash = BitConverter.ToString(objSHA1.ComputeHash(abBytesToHash)) 
cHash = Replace(cHash, "-", "") 

Lưu ý rằng tất cả tôi đã làm là loại bỏ các dòng abBytesToHash = objSHA1.ComputeHash(abBytesToHash) ...

Ngoài ra, bạn có thể thay đổi PHP để làm điều này:

$cInput = "the quick brown fox jumps over the lazy dog"; 
$cBase64 = base64_encode($cInput); 

echo "BASE64: " . $cBase64 . "<br />"; 
echo "SHA1: " . strtoupper(sha1(sha1($cBase64, true))); 
Các vấn đề liên quan