【问题标题】:Base64 HMAC SHA1 String in VBAVBA中的Base64 HMAC SHA1字符串
【发布时间】:2012-04-21 13:13:23
【问题描述】:

我正在尝试将 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 cryptography 库)。

我不是在寻找将这个 JavaScript 转换为 VBA 的人。我只是想了解这个 b64_hmac_sha1 函数正在输出什么,所以如果可能的话,我可以尝试找到在 VBA 中实现相同输出的方法。

此 JavaScript 库的副本在此网站上可见。您必须从 VBScript 向下滚动到 JavaScript 部分。 http://solstice.washington.edu/solstice/ASP_Signing_REST_Example

编辑1:
好的,这是我最终编写和使用的函数:

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=

【问题讨论】:

  • 我想补充一点,这个功能是 OAuth 1.0 所必需的,但不是 OAuth 2.0 所必需的。

标签: javascript vba encryption hmacsha1


【解决方案1】:

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 实现

我希望这回答得足够好,或者足够清楚。如果文字令人困惑,请告诉我。我尝试了几种表达方式,但似乎都没有那么清楚。

【讨论】:

  • 感谢您的帮助。我编写了函数并将它们发布在“Edit1”下的问题中。
  • 很高兴它有帮助。一切正常吗?据我所知,这个顺序看起来是正确的,虽然我从来没有写过 VB 或 VBA。
  • 我想我不确定它是否工作正常。我将发布一个示例。
【解决方案2】:

你写过:

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

这是一个误判。

Javascript 可以很容易地打包为 Windows 脚本组件 (WSC),然后通过 COM、VBA、Perl、VB6 或其他工具调用。

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

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

【讨论】:

  • 我实际上遇到过这个选项。我想我不会对调用外部 COM 服务器感到疯狂,除非我必须这样做。
猜你喜欢
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
相关资源
最近更新 更多