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

标签 php vb.net base64 sha1

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

相关文章:

php - Zend setElementsBelongTo() 对子表单元素的影响

php - 我应该使用 cron 作业来执行此更新吗

javascript - 使用 javascript 的 Response.Write() 无法正常工作

javascript - 将 s3 存储桶策略从 node.js 中的 JSON 转换为 base64

PHP 填充多维关联数组 - 最简单的方法

php - 如何在 Laravel 中格式化输出 MySQL 日期?

mysql - 用 SQL 替换 vb.net 查询

mysql - 检查与您的 mariadb 服务器版本对应的手册,了解在第 1 行 "user"附近使用的正确语法

javascript - Base64 DataURL 图片的大小限制是多少?

jquery - 在使用样式之前从 div 添加元素到头部样式