我对字符串的 SHA1 散列值有一些疑问。我正在尝试将文件从用 VB.net 编写的客户端发送到用 PHP 编写的服务器。我的问题是,当我将相同的字符串传递给 VB.net 和 PHP 时,VB.net 计算的 SHA1 值与 PHP 计算的值完全不同。
比如我想对一个字符串进行Base64编码,然后计算这个Base64字符串的SHA1 Hash。当计算机从 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)));
关于php - 相同的字符串,从 VB.net 和 PHP 获得的不同 SHA1 哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7336017/