相同的字符串,不同的SHA1哈希值从VB.net和PHP获得
问题描述:
我有一些字符串的SHA1哈希值的问题。我试图从用VB.net编写的客户端发送文件到用PHP编写的服务器。我的问题是,当我将相同的字符串传递给VB.net和PHP时,VB.net计算的SHA1值与PHP计算的值完全不同。相同的字符串,不同的SHA1哈希值从VB.net和PHP获得
例如,我想在Base64中编码一个字符串,然后计算Base64字符串的SHA1哈希值。当计算机从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)));
这些字符串的编码是什么? –
有趣的是http://www.tools4noobs.com/online_php_functions/sha1/给出16312751ef9307c3fd1afbcb993cdc80464ba0f1 –
@Captain:不,它给出了'350a2080264e2724d4bcbc521c35264d264a1daf'。该文本没有被哈希,它的base64编码是(为什么,我不知道)。 – ircmaxell