Как получить шестнадцатеричный хеш MD5 для файла с использованием VBA? - PullRequest
7 голосов
/ 13 мая 2010

Как мне получить шестнадцатеричный хеш MD5 для файла с использованием VBA?

Мне нужна версия, которая работает для файла.

Что-то простое, как этот код Python:

import hashlib

def md5_for_file(fileLocation, block_size=2**20):
    f = open(fileLocation)
    md5 = hashlib.md5()
    while True:
        data = f.read(block_size)
        if not data:
            break
        md5.update(data)
    f.close()
    return md5.hexdigest()

Но в VBA.

Ответы [ 3 ]

14 голосов
/ 25 июля 2013

Более старый вопрос, который мог бы использовать лучший ответ. Эти функции предназначены специально для хеширования файлов, а не для хеширования паролей. В качестве бонуса я включаю функцию для SHA1. Если вы избавитесь от объявлений типов, эти функции будут работать и в VBScript, за исключением того, что необходимо изменить функцию GetFileBytes, чтобы использовать FileSystemObject (или, возможно, ADO Stream), поскольку в VBScript Свободный файл не существует.

Private Sub TestMD5()
    Debug.Print FileToMD5Hex("C:\test.txt")
    Debug.Print FileToSHA1Hex("C:\test.txt")
End Sub

Public Function FileToMD5Hex(sFileName As String) As String
    Dim enc
    Dim bytes
    Dim outstr As String
    Dim pos As Integer
    Set enc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")
    'Convert the string to a byte array and hash it
    bytes = GetFileBytes(sFileName)
    bytes = enc.ComputeHash_2((bytes))
    'Convert the byte array to a hex string
    For pos = 1 To LenB(bytes)
        outstr = outstr & LCase(Right("0" & Hex(AscB(MidB(bytes, pos, 1))), 2))
    Next
    FileToMD5Hex = outstr
    Set enc = Nothing
End Function

Public Function FileToSHA1Hex(sFileName As String) As String
    Dim enc
    Dim bytes
    Dim outstr As String
    Dim pos As Integer
    Set enc = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider")
    'Convert the string to a byte array and hash it
    bytes = GetFileBytes(sFileName)
    bytes = enc.ComputeHash_2((bytes))
    'Convert the byte array to a hex string
    For pos = 1 To LenB(bytes)
        outstr = outstr & LCase(Right("0" & Hex(AscB(MidB(bytes, pos, 1))), 2))
    Next
    FileToSHA1Hex = outstr 'Returns a 40 byte/character hex string
    Set enc = Nothing
End Function

Private Function GetFileBytes(ByVal path As String) As Byte()
    Dim lngFileNum As Long
    Dim bytRtnVal() As Byte
    lngFileNum = FreeFile
    If LenB(Dir(path)) Then ''// Does file exist?
        Open path For Binary Access Read As lngFileNum
        ReDim bytRtnVal(LOF(lngFileNum) - 1&) As Byte
        Get lngFileNum, , bytRtnVal
        Close lngFileNum
    Else
        Err.Raise 53
    End If
    GetFileBytes = bytRtnVal
    Erase bytRtnVal
End Function
3 голосов
/ 13 мая 2010
0 голосов
/ 01 февраля 2012

Это должно сделать это:

        Dim fileBytes() As Byte = File.ReadAllBytes(path:=fullPath)
        Dim Md5 As New MD5CryptoServiceProvider()
        Dim byteHash() As Byte = Md5.ComputeHash(fileBytes)
        Return Convert.ToBase64String(byteHash)
...