Одна и та же строка, разные значения хеша SHA1, полученные из VB.net и PHP - PullRequest
5 голосов
/ 07 сентября 2011

У меня проблемы с хеш-значением строки SHA1.Я пытаюсь отправить файл с клиента, написанного на VB.net, на сервер, написанный на PHP.Моя проблема в том, что когда я передаю одну и ту же строку в VB.net и PHP, значение SHA1, вычисленное VB.net, полностью отличается от значения, вычисляемого PHP.

Например, я хочу кодировать строкув Base64, а затем вычислите хэш SHA1 строки 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

1 Ответ

6 голосов
/ 07 сентября 2011

Ну, проблема в том, что вы используете двойное хеширование в .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)));
...