2012-04-09 91 views
4

我試圖將ASP/VBScript OAuth庫轉換爲VBA。其中一個挑戰是這樣一行代碼:Base64 HMAC SHA1 VBA中的字符串

Get_Signature = b64_hmac_sha1(strSecret, strBaseSignature) 

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

因爲我對加密知之甚少,所以我不清楚b64_hmac_sha1函數的功能。 HMAC SHA1與SHA1不同嗎?

我半懷疑我可能能夠在網上找到一些VBA代碼來做我需要做的事情,只要我明白這個功能實際上在做什麼。如果我找不到現有的函數,那麼我可能會編寫一個使用.NET密碼庫的函數(如果您知道如何,實際上可以從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= 
+0

我想補充一點,此功能對於OAuth 1.0是必需的,但對OAuth 2.0不是必需的。 – HK1 2012-04-09 13:17:14

回答

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編碼的實現。如果文字混淆,請告訴我。我嘗試了一些如何表達的路線,而且沒有一個看起來很清楚。

+0

感謝您的幫助。我編寫了我的函數,並將它們發佈在「Edit1」下的問題中。 – HK1 2012-04-09 04:33:53

+0

很高興幫助。一切正常嗎?盡我從未寫過VB或VBA,順序看起來是正確的,盡我所知。 – mfanto 2012-04-09 04:37:45

+0

我想我不確定它是否正常工作。我會舉一個例子。 – HK1 2012-04-09 04:47:52

0

您採寫:

在我看來,調用由VBA JavaScript函數是相當不切實際的。

這是一個錯誤的判斷。

JavaScript可以很容易地打包成Windows腳本組件(WSC),然後通過COM,從VBA,Perl,VB6或什麼都可以。

這裏的包裝JavaScript作爲一種WSC和調用它的一個例子:https://stackoverflow.com/a/849970/48082

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

+0

我實際上碰到了這個選項。我想我不會爲調用外部COM服務器而瘋狂,除非我絕對必須這樣做。 – HK1 2012-04-09 04:18:49