相同的字符串,不同的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 
+2

这些字符串的编码是什么? –

+0

有趣的是http://www.tools4noobs.com/online_php_functions/sha1/给出16312751ef9307c3fd1afbcb993cdc80464ba0f1 –

+0

@Captain:不,它给出了'350a2080264e2724d4bcbc521c35264d264a1daf'。该文本没有被哈希,它的base64编码是(为什么,我不知道)。 – ircmaxell

好了,问题是,你是双散列在.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)));