archivo de la computación HASH devuelve valores diferentes
Pregunta
¿Alguien sabe, por qué el código siguiente devuelve resultados diferentes en algunas máquinas?
Private Shared Function ComputeHashValue(ByVal Data As String) As String
Dim HashAlgorithm As SHA512 = SHA512.Create
Dim HashValue() As Byte = HashAlgorithm.ComputeHash(Encoding.ASCII.GetBytes(Data))
' Looping over the array and ANDing each byte with 0111111
For i As Integer = 0 To HashValue.Length - 1
HashValue(i) = HashValue(i) And Convert.ToByte(127)
Next
Return Encoding.ASCII.GetString(HashValue)
End Function
Private Shared Function AreByteArraysEqual(ByVal array1 As Byte(), ByVal array2 As Byte()) As Boolean
If array1.Length <> array2.Length Then Return False
For i As Integer = 0 To array1.Length - 1
If array1(i) <> array2(i) Then Return False
Next
Return True
End Function
Private Shared Sub SomeMethod()
Dim t_prvBytes() As Byte = New Byte() {SOME VALUES} 'Previously computed HASH
Dim t_dllStream As New IO.FileStream("C:\myfile.txt", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
Dim t_reader As New IO.StreamReader(t_dllStream)
Dim t_dllHash() As Byte = System.Text.Encoding.Unicode.GetBytes(ComputeHashValue(t_reader.ReadToEnd))
MsgBox(AreByteArraysEqual(t_dllHash, t_prvBytes))
t_dllStream.Close()
End Function
Solución
No se le debe convertir el texto a través de comprobación aleatoria, Encoding.ASCII
. Es no de texto ASCII. (No es texto en absoluto.) También está hash el resultado de ASCII a codificar el texto original, que se lee en el uso de Encoding.Unicode
. ¿Por qué?
Lo estás haciendo todo tipo de conversiones entre el texto y binario - y es probable que no debe hacer cualquier . Sólo hash de los datos binarios (usando HashAlgorithm.ComputeHash(Stream)
), y mantener el resultado en binaria también. Si realmente necesidad de convertir los datos binarios en texto, utilice Convert.ToBase64String
.
Además, usted está comparando los datos con un valor calculado previamente -. Pero no ha explicado en el que el valor calculado previamente venía de empezar con