Computação HASH arquivo retorna valores diferentes
Pergunta
Alguém sabe, por que os seguintes retorna código de resultados diferentes em algumas 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
Solução
Você não deve ser converter o hash em texto via Encoding.ASCII
. É não texto ASCII. (Não é texto em tudo.) Você também está hashing o resultado de ASCII-codificar o texto original, o que você lê na utilização Encoding.Unicode
. Por quê?
Você está fazendo todos os tipos de conversões entre texto e binário - e você provavelmente não deveria estar fazendo qualquer . Apenas botar os dados binários (usando HashAlgorithm.ComputeHash(Stream)
), e manter o resultado em binário também. Se você realmente necessidade de converter os dados binários em texto, use Convert.ToBase64String
.
Além disso, você está comparando os dados com um valor previamente calculado -. Mas você não explicou onde esse valor previamente calculado veio para começar