我正在尝试将 ASP/VBScript OAuth 库转换为 VBA。挑战之一是这行代码:
Get_Signature = b64_hmac_sha1(strSecret, strBaseSignature)
这个函数,b64_hmac_sha1 实际上是一个包含在 JavaScript 库中的函数。在我看来,从 VBA 调用 JavaScript 函数是相当不切实际的。
因为我对加密知之甚少,所以我什至不清楚这个 b64_hmac_sha1 函数的作用。HMAC SHA1 与 SHA1 不同吗?
我有一半怀疑如果我只是了解这个函数实际上在做什么,我可能能够在网上找到一些 VBA 代码来做我需要做的事情。如果我没有找到现有的函数,我可能会编写一个使用 .NET Cryptography 库的函数(如果你知道怎么做,你实际上可以从 VBA 调用 .NET 加密库)。
我不是在寻找将这个 JavaScript 转换为 VBA 的人。我只是想了解这个 b64_hmac_sha1 函数正在输出什么,所以如果可能的话,我可以尝试找到在 VBA 中实现相同输出的方法。
此 JavaScript 库的副本可在本网站上看到。您必须从 VBScript 向下滚动到 JavaScript 部分。 http://solstice.washington.edu/solstice/ASP_Signing_REST_Example
Edit1:
好的,这是我最终编写和使用的函数:
Public Function Base64_HMACSHA1(ByVal sTextToHash As String, ByVal sSharedSecretKey As String)
Dim asc As Object, enc As Object
Dim TextToHash() As Byte
Dim SharedSecretKey() As Byte
Set asc = CreateObject("System.Text.UTF8Encoding")
Set enc = CreateObject("System.Security.Cryptography.HMACSHA1")
TextToHash = asc.Getbytes_4(sTextToHash)
SharedSecretKey = asc.Getbytes_4(sSharedSecretKey)
enc.Key = SharedSecretKey
Dim bytes() As Byte
bytes = enc.ComputeHash_2((TextToHash))
Base64_HMACSHA1 = EncodeBase64(bytes)
Set asc = Nothing
Set enc = Nothing
End Function
Private Function EncodeBase64(ByRef arrData() As Byte) As String
Dim objXML As MSXML2.DOMDocument
Dim objNode As MSXML2.IXMLDOMElement
Set objXML = New MSXML2.DOMDocument
' byte array to base64
Set objNode = objXML.createElement("b64")
objNode.DataType = "bin.base64"
objNode.nodeTypedValue = arrData
EncodeBase64 = objNode.Text
Set objNode = Nothing
Set objXML = Nothing
End Function
使用此功能:
Debug.Print Base64_HMACSHA1("abc", "123")
VAsMU9SSWDe9krP3Gr56nXC2dsQ=