Zwei Dateien via Hashwert (MD5) miteinander vergleichen

  • VBScript

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Zwei Dateien via Hashwert (MD5) miteinander vergleichen

    Hi Zusammen, ich recherchiere schon länger nach ein Lösung via VBS. Ich möchte gerne zwei Dateien miteinander vergleichen, falls diese dann "gleich" sind soll die Datei aus dem Quellordner in den Zielordner kopiert werden.
    Das kopieren usw. habe ich bereits gecoded.

    Ich finde aber keinen wirklichen Ansatz zur Hashüberprüfung via VBS. Eher Lösungen mit VBA oder Vb.net

    Habt ihr vielleicht eine Idee wie ich das am Besten via VBS hinkriege oder ist es sinnvoller den Hashwert mit VB.net zu überprüfen?


    Viele Grüße
    Du kannst den CryptoserviceProvider auch aus VBS aufrufen
    Set Encryptor = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider")Geht vermutlich auch mit MD5, wenn du SHA1 nicht magst..

    Alternativ kannst du auch die Managed-Funktionen verwenden:

    Visual Basic-Quellcode

    1. Set SHA = CreateObject("System.Security.Cryptography.SHA1Managed")
    2. Set UTF8 = CreateObject("System.Text.UTF8Encoding")
    3. HashArray = SHA.ComputeHash_2(UTF8.GetBytes_4(Text))


    P.S.:

    sajodino schrieb:

    Ich finde aber keinen wirklichen Ansatz zur Hashüberprüfung via VBS. Eher Lösungen mit VBA
    Wenn du eine VBA-Lösung hast, dann hast du in den meisten Fällen auch die VBS-Lösung.
    Natürlich mit Ausnahme der anwendungsspezifischen Methoden. Aber da gehört Kryptographie nicht dazu.


    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Hi und Danke!
    Habe es mal mit VB.net probiert und nen Codesnippet aussem Netz. Wenn ich die zu vergleichenden Dateien in einen Haswert umwandle haben beide unterschiedliche Haswerte.
    Liegt es vielleicht daran, dass beide in unterschiedlichen Ordnern liegen? Wie gesagt, es sind beide die gleichen Dateien

    Ich probier mal den VBS-Ansatz

    Viele Grüße
    Hashwerte sind reproduzierbar.
    Wenn du bei zwei vermeintlich gleichen Dateien unterschiedliche Hashes bekommst, sind die Dateien nicht gleich.
    Oder du verwendest nicht denselben Hash-Algorithmus.

    Was jagst du durch die Hash-Funktion? Nur die Dateiinhalte oder auch noch andere Informationen?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Wenn ich das richtig sehe , ist das hier weder md5 noch sha1? Kenne mich in der Materie wenig aus. Ich habe mich auf md5 festgestellt, weil ich das noch zuordnen kann. Welche die beste Methode weiss ich nicht. Mir geht es halt drum, dass falls sich eine der Dateien im Kopier/Downloadmodus befindet aber trotzdem schon im Ordner angezeigt wird, diese erst nach dem Kopier/Downloadvorgang verschoben werden soll.

    Das ist nen Snippet von mir erweitert von dieser Seite :

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Security
    3. Imports System.Security.Cryptography
    4. Imports System.Text
    5. Module Module1
    6. Sub Main()
    7. Dim sSourceData As String
    8. Dim Zieldata As String
    9. Dim tmpSource() As Byte
    10. Dim tmpSource1() As Byte
    11. Dim tmpHash() As Byte
    12. Dim tmpHash1() As Byte
    13. sSourceData = "C:\Zielordner\1\1111 - Kopie - Kopie (11).xls"
    14. Zieldata = "J:\DAS\exceltemp\1\1111 - Kopie - Kopie (11).xls"
    15. 'Create a byte array from source data.
    16. tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData)
    17. tmpSource1 = ASCIIEncoding.ASCII.GetBytes(Zieldata)
    18. Console.WriteLine((tmpSource))
    19. Console.WriteLine((tmpSource1))
    20. 'Compute hash based on source data.
    21. tmpHash = New MD5CryptoServiceProvider().ComputeHash(tmpSource)
    22. Console.WriteLine(ByteArrayToString(tmpHash))
    23. tmpHash1 = New MD5CryptoServiceProvider().ComputeHash(tmpSource1)
    24. Console.WriteLine(ByteArrayToString(tmpHash1))
    25. sSourceData = "C:\Zielordner\1\1111 - Kopie - Kopie (11).xls"
    26. tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData)
    27. Console.WriteLine(ByteArrayToString(tmpHash))
    28. Zieldata = "J:\DAS\exceltemp\1\1111 - Kopie - Kopie (11).xls"
    29. tmpSource1 = ASCIIEncoding.ASCII.GetBytes(Zieldata)
    30. Console.WriteLine(ByteArrayToString(tmpHash1))
    31. Dim tmpNewHash() As Byte
    32. Dim tmpNewHash1() As Byte
    33. Dim bEqual As Boolean = False
    34. tmpNewHash = New MD5CryptoServiceProvider().ComputeHash(tmpSource)
    35. tmpNewHash1 = New MD5CryptoServiceProvider().ComputeHash(tmpSource1)
    36. If tmpNewHash.Length = tmpNewHash1.Length Then
    37. Dim i As Integer
    38. Do While (i < tmpNewHash.Length) AndAlso (tmpNewHash(i) = tmpNewHash1(i))
    39. i += 1
    40. Loop
    41. If i = tmpNewHash.Length Then
    42. bEqual = True
    43. End If
    44. End If
    45. If bEqual Then
    46. Console.WriteLine("The two hash values are the same")
    47. Else
    48. Console.WriteLine("The two hash values are not the same")
    49. End If
    50. Console.ReadLine()
    51. End Sub
    52. Private Function ByteArrayToString(ByVal arrInput() As Byte) As String
    53. Dim i As Integer
    54. Dim sOutput As New StringBuilder(arrInput.Length)
    55. For i = 0 To arrInput.Length - 1
    56. sOutput.Append(arrInput(i).ToString("X2"))
    57. Next
    58. Return sOutput.ToString()
    59. End Function
    60. End Module

    danke, total übersehen.

    Habe mal bisschen rumgefuscht. Wenn ich einen Buchstabe bei

    [vbnetsSourceData = "C:\Zielordner\1\1111 - Kopie - Kopie (11).xls"][/vbnet]

    veränder, ändert sich der Hashwert. Kriege auch keinen Fehler, kann dort etwas beliebiges rein schreiben und der gibt mir den String dann als hashwert aus. Geht wohl nicht auf die Datei ein.
    Du berechnest auch nicht den Hash der Dateien sondern der Strings der Pfade. Du musst schon die dateien selber in ein ByteArray einlesen..

    VB.NET-Quellcode

    1. sSourceData = "C:\Zielordner\1\1111 - Kopie - Kopie (11).xls"
    2. tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData)


    Hier musst du eine Datei einlesen.
    Einfachster Weg:

    VB.NET-Quellcode

    1. File.ReadAllBytes(fileName);
    Das ist meine Signatur und sie wird wunderbar sein!
    Mal kurz eine andere Frage bezogen auf das Thema.
    Wenn ich aus einem Ordner alle Dateien durch den Hashprozess jagen will , kann ich das am Besten mit For Next? Ich möchte es erstmal schaffen , dass alle Dateien durchgejagt werden und mir die Hashwerte ausgegeben werden. Komme da irgendwie nicht weiter

    VB.NET-Quellcode

    1. Dim tmpHash() As Byte
    2. Dim tmpSource() As Byte
    3. Dim ordner3 As Object
    4. Dim ordner4 As Object
    5. Dim fso = CreateObject("Scripting.FileSystemObject")
    6. ordner3 = "C:\Zielordner\1\"
    7. ordner4 = "J:\DAS\exceltemp\1\"
    8. For Each ofile In fso.GetFolder(ordner3).Files
    9. Dim tmpSource() As Byte = File.ReadAllBytes(ofile)
    10. 'Compute hash based on source data.
    11. tmpHash = New MD5CryptoServiceProvider().ComputeHash(tmpSource)
    12. Console.WriteLine(ByteArrayToString(tmpHash))
    13. Next