相同的字符串,不同的SHA1哈希值从VB.net和PHP获得


Same string, different SHA1 hash values obtained from VB.net and PHP

我对字符串的SHA1哈希值有一些问题。我试图发送一个文件从客户端写在VB.net到服务器写在PHP。我的问题是,当我将相同的字符串传递给VB.net和PHP时,VB.net计算的SHA1值与PHP计算的值完全不同。

例如,我想用Base64编码一个字符串,然后计算Base64字符串的SHA1哈希值。当计算机从vb.net版本和PHP版本执行此任务时,我得到两个不同的SHA1值,即使Base64编码的字符串显然是相同的:

VB.net 2 e97a53b09c482a831540b532845bcac79bfaccfPHP: 350 a2080264e2724d4bcbc521c35264d264a1daf

我肯定是漏掉了什么,你能给我指出正确的方向并告诉我哪里做错了吗?

Thank you very much

下面是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)));