Asp-Classic

如何在經典 ASP 中使用 VBScript 生成 MD5?

  • May 31, 2017

我需要在我的應用程序中生成一個 MD5。

我試過Google,但只能找到 MD5 的 PHP 程式碼。我需要連接到使用 MD5 雜湊驗證的客戶端系統,但他們的程式碼是 PHP,我的是使用 VBScript 的經典 ASP。

我的伺服器支持 .Net,所以我不能使用 PHP 腳本。Classic ASP 中的 VBScript 是否有這樣的 MD5 程式碼?

2017-02-21 更新 - 現在為 JWT 添加了 HMACSHA256

2016-07-05 更新 - 現在添加了 SHA1 和 SHA256

是的,對於所有一直在努力解決這個問題的人(比如我自己)並想知道,這是可能的!

以下程式碼分為幾個函式,以便您可以 MD5/sha1/sha256 字元串或文件。

我從另一個 stackexchange 借用了 GetBytes 和 BytesToBase64 函式,而 stringToUTFBytes 中的程式碼是基於另一個 stackexchange 的。

function md5hashBytes(aBytes)
   Dim MD5
   set MD5 = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")

   MD5.Initialize()
   'Note you MUST use computehash_2 to get the correct version of this method, and the bytes MUST be double wrapped in brackets to ensure they get passed in correctly.
   md5hashBytes = MD5.ComputeHash_2( (aBytes) )
end function

function sha1hashBytes(aBytes)
   Dim sha1
   set sha1 = CreateObject("System.Security.Cryptography.SHA1Managed")

   sha1.Initialize()
   'Note you MUST use computehash_2 to get the correct version of this method, and the bytes MUST be double wrapped in brackets to ensure they get passed in correctly.
   sha1hashBytes = sha1.ComputeHash_2( (aBytes) )
end function

function sha256hashBytes(aBytes)
   Dim sha256
   set sha256 = CreateObject("System.Security.Cryptography.SHA256Managed")

   sha256.Initialize()
   'Note you MUST use computehash_2 to get the correct version of this method, and the bytes MUST be double wrapped in brackets to ensure they get passed in correctly.
   sha256hashBytes = sha256.ComputeHash_2( (aBytes) )
end function

function sha256HMACBytes(aBytes, aKey)
   Dim sha256
   set sha256 = CreateObject("System.Security.Cryptography.HMACSHA256")

   sha256.Initialize()
   sha256.key=aKey
   'Note you MUST use computehash_2 to get the correct version of this method, and the bytes MUST be double wrapped in brackets to ensure they get passed in correctly.
   sha256HMACBytes = sha256.ComputeHash_2( (aBytes) )
end function

function stringToUTFBytes(aString)
   Dim UTF8
   Set UTF8 = CreateObject("System.Text.UTF8Encoding")
   stringToUTFBytes = UTF8.GetBytes_4(aString)
end function

function bytesToHex(aBytes)
   dim hexStr, x
   for x=1 to lenb(aBytes)
       hexStr= hex(ascb(midb( (aBytes),x,1)))
       if len(hexStr)=1 then hexStr="0" & hexStr
       bytesToHex=bytesToHex & hexStr
   next
end function

Function BytesToBase64(varBytes)
   With CreateObject("MSXML2.DomDocument").CreateElement("b64")
       .dataType = "bin.base64"
       .nodeTypedValue = varBytes
       BytesToBase64 = .Text
   End With
End Function

'Special version that produces the URLEncoded variant of Base64 used in JWTs.
Function BytesToBase64UrlEncode(varBytes)
   With CreateObject("MSXML2.DomDocument").CreateElement("b64")
       .dataType = "bin.base64"
       .nodeTypedValue = varBytes
       BytesToBase64UrlEncode = replace(replace(replace(replace(replace(.Text,chr(13),""),chr(10),""),"+", "-"),"/", "_"),"=", "")
   End With
End Function

Function GetBytes(sPath)
   With CreateObject("Adodb.Stream")
       .Type = 1 ' adTypeBinary
       .Open
       .LoadFromFile sPath
       .Position = 0
       GetBytes = .Read
       .Close
   End With
End Function

這些可以按如下方式使用:

BytesToBase64(md5hashBytes(stringToUTFBytes("Hello World")))

產生:sQqNsWTgdUEFt6mb5y4/5Q==

bytesToHex(md5hashBytes(stringToUTFBytes("Hello World")))

生產:B10A8DB164E0754105B7A99BE72E3FE5

對於 SHA1:

bytesToHex(sha1hashBytes(stringToUTFBytes("Hello World")))

生產:0A4D55A8D778E5022FAB701977C5D840BBC486D0

對於 SHA256:

bytesToHex(sha256hashBytes(stringToUTFBytes("Hello World")))

生產:A591A6D40BF420404A011733CFB7B190D62C65BF0BCDA32B57B277D9AD9F146E

獲取文件的 MD5(對 Amazon S3 MD5 檢查很有用):

BytesToBase64(md5hashBytes(GetBytes(sPath)))

其中 sPath 是本地文件的路徑。

最後,創建 JWT:

'define the JWT header, needs to be converted to UTF bytes:
aHead=stringToUTFBytes("{""alg"":""HS256"",""typ"":""JWT""}")

'define the JWT payload, again needs to be converted to UTF Bytes.
aPayload=stringToUTFBytes("{""sub"":""1234567890"",""name"":""John Doe"",""admin"":true}") 

'Your shared key.
theKey="mySuperSecret"

aSigSource=stringToUTFBytes(BytesToBase64UrlEncode(aHead) & "." & BytesToBase64UrlEncode(aPayload))

'The full JWT correctly Base 64 URL encoded.
aJWT=BytesToBase64UrlEncode(aHead) & "." & BytesToBase64UrlEncode(aPayload) & "." & BytesToBase64UrlEncode(sha256HMACBytes(aSigSource,stringToUTFBytes(theKey)))

這將產生以下有效的 JWT:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.7ofvtkn0z_pTl6WcqRTxw-4eSE3NqcEq9

這是一個可讀和可下載的 MD5 版本作為 VBS 腳本:

https://github.com/Wikinaut/md5.vbs

這是來自http://chayoung.tistory.com/entry/VBScript-MD5的程式碼(感謝您提供這段獨特的程式碼)。

引用自:https://stackoverflow.com/questions/10198690