【问题标题】:Same string, different SHA1 hash values obtained from VB.net and PHP从 VB.net 和 PHP 获得的相同字符串,不同的 SHA1 哈希值
【发布时间】:2011-11-12 06:08:15
【问题描述】:

我对字符串的 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

【问题讨论】:

  • 这些字符串的编码是什么?
  • 有趣的是tools4noobs.com/online_php_functions/sha1 给出了 16312751ef9307c3fd1afbcb993cdc80464ba0f1
  • @Captain:不,它没有,它给了350a2080264e2724d4bcbc521c35264d264a1daf。文本没有被散列,它的 base64 编码是(为什么,我不知道)。
  • @Captain Giraffe - 您粘贴的内容有误,因为您提供的链接提供了350A2080264E2724D4BCBC521C35264D264A1DAF

标签: php vb.net base64 sha1


【解决方案1】:

好吧,问题是您在 .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)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 2014-12-25
    • 1970-01-01
    • 2018-07-28
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    相关资源
    最近更新 更多