簡體   English   中英

Base64 VBA 中的 HMAC SHA1 字符串

[英]Base64 HMAC SHA1 String in VBA

我正在嘗試將 ASP/VBScript OAuth 庫轉換為 VBA。挑戰之一是這行代碼:

Get_Signature = b64_hmac_sha1(strSecret, strBaseSignature)

這個function,b64_hmac_sha1其實是一個function包含在一個JavaScript庫中。 在我看來,從 VBA 調用 JavaScript function 是相當不切實際的。

因為我對加密知之甚少,所以我什至不清楚這個 b64_hmac_sha1 function 是做什么的。 HMAC SHA1 與 SHA1 不同嗎?

我有點懷疑,如果我只了解這個 function 實際在做什么,我也許可以在網上找到一些 VBA 代碼來做我需要做的事情。 如果我找不到現有的 function,我可能會編寫一個使用 .NET 密碼庫的密碼庫(如果您知道如何操作,您實際上可以從 VBA 調用 .NET 密碼庫)。

我不是在找人將這個 JavaScript 轉換為 VBA。我只是想了解這個 b64_hmac_sha1 function 輸出的是什么,所以如果可能的話,我可以嘗試找到在 VBA 中實現相同 output 的方法。

這個 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

使用這個 function:

Debug.Print Base64_HMACSHA1("abc", "123")
VAsMU9SSWDe9krP3Gr56nXC2dsQ=

HMAC 是一種將 hash function(如 SHA1)轉換為消息驗證碼(MAC) 的結構。

正常的 hash 函數沒有任何與之關聯的秘密數據。 這意味着任何人都可以計算摘要,假設他們有原始輸入。 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 編碼 output,讓它漂亮。

這段代碼最終要做的是獲取一些輸入和一些密鑰,計算一個 160 位的摘要,並對結果進行 base64 編碼。

.NET中有SHA1 HMAC的實現

看起來像是 VBA 的 Base64 的實現

我希望這能很好地回答它,或者足夠清楚。 如果文字令人困惑,請告訴我。 我嘗試了幾種表達方式,但似乎都不是那么清楚。

你寫:

在我看來,從 VBA 調用 JavaScript function 是相當不切實際的。

那是誤判。

Javascript 可以輕松打包為 Windows 腳本組件 (WSC),然后通過 COM、VBA、Perl、VB6 或其他任何方式調用。

下面是將 Javascript 打包為 WSC 並調用它的示例: https://stackoverflow.com/a/849970/48082

因此,您的問題應該很容易解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM