VBA中的Base64 HMAC SHA1字符串

时间:2012-04-09 03:21:33

标签: javascript vba encryption hmacsha1

我正在尝试将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=

2 个答案:

答案 0 :(得分:5)

HMAC是一种用于将哈希函数(如SHA1)转换为Message Authentication Code(MAC)的构造。

普通哈希函数没有任何与之关联的秘密数据。这意味着任何人都可以计算摘要,假设他们有原始输入。 HMAC使用密钥,因此只有拥有密钥的人才能计算输出。

假设我有一个文件file.txt。我想发送给你,我们需要确保没有人篡改它。对不起,我没有聪明的方法用文字表示这个。

me -> file.txt -> you
me -> SHA1(file.txt) -> you

然后通过计算自己的SHA1摘要验证结果,并验证它与我发送给你的内容相匹配。

现在假设攻击者处于中间位置。不幸的是,由于没有秘密,攻击者可以修改文件,并计算自己的文件/摘要对。当你计算你的版本时,它会与他发送的内容相匹配,你就不会更聪明了。

me -> file.txt -> attacker -> modified.txt -> you
me -> SHA1(file.txt) -> attacker -> SHA1(modified.txt) -> you

使用HMAC,我们在计算中添加一个密钥。

me -> file.txt -> you
me -> SHA1_HMAC(file.txt, our_secret) -> you

计算版本时,也应用密钥,结果匹配。攻击者在不知道密钥的情况下无法替换摘要。

me -> file.txt -> attacker -> modified.txt -> you 
me -> SHA1(file.txt) -> attacker -> SHA1_HMAC(modified.txt, // DOESN'T KNOW KEY) -> you

HMAC是一种非常具体的添加密钥的方法。不幸的是,只是将密钥连接到文件末尾或在散列之前预先挂起的简单方法容易受到不同的攻击(例如,长度扩展攻击)。

B64是Base64编码输出,使其漂亮。

此代码最终正在做的是获取一些输入和一些密钥,并计算160位摘要,并对结果进行base64编码。

有一个SHA1 HMAC in .NET

的实现

This看起来像是用于VBA的Base64的实现

我希望这个回答得足够好,或者足够清楚。如果文字令人困惑,请告诉我。我尝试了几种如何表达它的路线,但它们似乎都不清楚。

答案 1 :(得分:0)

你写过:

  

在我看来,从VBA调用JavaScript函数是相当不切实际的。

这是一个误判。

Javascript可以轻松打包为Windows脚本组件(WSC),然后通过COM从VBA,Perl,VB6或者你拥有的东西中调用。

以下是将Javascript打包为WSC并调用它的示例:https://stackoverflow.com/a/849970/48082

因此,您的问题应该很容易解决。