2011-09-07 14 views
5

Tengo algunos problemas con el valor de hash SHA1 de una cadena. Estoy tratando de enviar un archivo de un cliente escrito en VB.net a un servidor escrito en PHP. Mi problema es que cuando paso la misma cadena a VB.net y PHP, el valor de SHA1 calculado por VB.net es completamente diferente del valor calculado por PHP.Misma cadena, diferentes valores de hash SHA1 obtenidos de VB.net y PHP

Por ejemplo, quiero codificar una cadena en Base64 y luego calcular el Hash SHA1 de la cadena Base64. Cuando el ordenador se ejecuta esta tarea desde la versión vb.net y desde la versión de PHP consigo dos valores SHA1 diferentes, aunque al parecer la cadena codificada en Base64 es el mismo:

VB.net: 2E97A53B09C482A831540B532845BCAC79BFACCF PHP: 350A2080264E2724D4BCBC521C35264D264A1DAF

Seguramente me falta algo, ¿podría señalarme en la dirección correcta y decirme qué estoy haciendo mal aquí?

muchas gracias

está aquí el Código 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 

Y aquí está el código 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

¿Cuál es la codificación de estas cadenas? –

+0

Divertido que http://www.tools4noobs.com/online_php_functions/sha1/ da 16312751ef9307c3fd1afbcb993cdc80464ba0f1 –

+0

@Captain: No, no, da '350a2080264e2724d4bcbc521c35264d264a1daf'. El texto no está siendo hash, la codificación base64 es (por qué, no tengo ni idea). – ircmaxell

Respuesta

6

Bueno, el problema es que eres la doble dispersión en .NET y solo hash simple en PHP. Esto es lo que estás haciendo en .NET traducido a 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); 

Así que estás doble hashing it. Para solucionarlo, sólo tiene que cambiar su algoritmo para:

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, "-", "") 

Tenga en cuenta que todo lo que hice fue quitar la línea abBytesToHash = objSHA1.ComputeHash(abBytesToHash) ...

Como alternativa, puede cambiar el PHP para hacer esto:

$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))); 
Cuestiones relacionadas