Question

Quelqu'un sait-il, pourquoi le code suivant renvoie des résultats différents sur certaines machines?

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
Était-ce utile?

La solution

Vous ne devriez pas être en train de convertir le hachage en texte via Encoding.ASCII. Il est pas texte ASCII. (Il est pas du texte du tout.) Vous hachant aussi le résultat de l'ASCII codant pour le texte original, que vous avez lu dans l'utilisation Encoding.Unicode. Pourquoi?

Vous faites toutes sortes de conversions entre le texte et binaire - et vous ne devriez probablement pas faire any . Il suffit de hachage des données binaires (en utilisant HashAlgorithm.ComputeHash(Stream) ), et de garder le résultat dans binaire aussi. Si vous vraiment besoin de convertir les données binaires en texte, utilisez Convert.ToBase64String .

De plus, vous comparez les données avec une valeur calculée précédemment -. Mais vous ne l'avez pas expliqué où cette valeur précédemment calculée est venue de commencer par

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top