У меня есть некоторые проблемы с хэш-значением SHA1 строки. Я пытаюсь отправить файл с клиента, написанного на VB.net, на сервер, написанный на PHP. Моя проблема в том, что когда я передаю одну и ту же строку в VB.net и PHP, значение SHA1, вычисленное VB.net, полностью отличается от значения, вычисленного PHP.
Например, я хочу закодировать строку в Base64, а затем вычислить SHA1 Hash строки Base64. Когда компьютер выполняет эту задачу из версии vb.net и из версии PHP, я получаю два разных значения SHA1, даже если, судя по всему, кодировка Base64 одинакова:
VB.net: 2E97A53B09C482A831540B532845BCAC79BFACCF PHP: 350A2080264E2724D4BCBC521C35264D264A1DAF
Я что-то упустил, не могли бы вы указать мне в правильном направлении и сказать мне, что я здесь делаю неправильно?
большое спасибо
Вот код 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
И вот код 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
Ну, проблема в том, что вы используете хэширование в .NET и только одно хеширование в PHP. Вот что вы делаете в .NET, переведенном на 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);
Таким образом, вы удваиваете его. Чтобы исправить это, вам просто нужно изменить свой алгоритм на:
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, "-", "")
Обратите внимание, что все, что я сделал, это удалить abBytesToHash = objSHA1.ComputeHash(abBytesToHash)
…
Кроме того, вы можете изменить PHP для этого:
$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)));