An older question that might use a better answer. These features are specifically designed for hashing files, not for hashing passwords. As a bonus, I turn on the function for SHA1. If you get rid of type declarations, these functions work in VBScript, except that the GetFileBytes function must be modified to use FileSystemObject (or, possibly, ADO Stream), since there is no free file in 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
Hk1
source share