Computing Dateihash gibt unterschiedliche Werte
Frage
Weiß jemand, warum der folgende Code gibt unterschiedliche Ergebnisse auf einigen Maschinen?
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
Lösung
Sie sollten nicht den Hash in Text über Encoding.ASCII
werden zu konvertieren. Es ist nicht ASCII-Text. (Es ist nicht auf den gesamten Text.) Sie sind Hashing auch das Ergebnis der ASCII-Codierung des Originaltextes, die Sie bei der Verwendung Encoding.Unicode
lesen. Warum?
Sie sind alle Arten von Konvertierungen zwischen Text und Binärformat tun - und Sie sollten wahrscheinlich nicht tun jeder werden. Gerade hash die Binärdaten (unter Verwendung HashAlgorithm.ComputeHash(Stream)
) und halten Sie das Ergebnis in auch binär. Wenn Sie wirklich müssen die binären Daten in Text konvertieren, verwenden Sie Convert.ToBase64String
.
Darüber hinaus ist die Daten mit einem zuvor berechneten Wert verglichen wird -. Aber Sie haben nicht erklärt, wo der zuvor berechnete Wert herkommt, mit zu beginnen