5

ASP/VBScript OAuth ライブラリを VBA に変換しようとしています。課題の 1 つは、次のコード行です。

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 ライブラリのコピーは、この Web サイトで見ることができます。VBScript を越えて JavaScript セクションまで下にスクロールする必要があります。 http://solstice.washington.edu/solstice/ASP_Signing_REST_Example

Edit1:
OK、これが私が書いて使用した関数です:

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=
4

2 に答える 2

5

HMACは、SHA1などのハッシュ関数をメッセージ認証コード(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でエンコードすることです。

.NETにはSHA1HMACの実装があります

これは、VBA用のBase64の実装のように見えます

これが十分に答えるか、十分に明確になることを願っています。テキストがわかりにくい場合は、お知らせください。私はそれを表現する方法のいくつかのルートを試しましたが、どれもそれほど明確ではないようでした。

于 2012-04-09T03:57:12.640 に答える
0

あなたが書いた:

VBA から JavaScript 関数を呼び出すのはかなり非現実的です。

それは判断ミスです。

Javascript は、Windows スクリプト コンポーネント (WSC) として簡単にパッケージ化でき、VBA、Perl、VB6、または what-have-you から COM 経由で呼び出すことができます。

Javascript を WSC としてパッケージ化して呼び出す例を次に示します: https://stackoverflow.com/a/849970/48082

したがって、問題は簡単に解決できるはずです。

于 2012-04-09T04:07:49.677 に答える