5

助けてください!私はこれの上に髪を引っ張っています。:)

認証のためにHMACSHA1を実行する必要があるサイトがあります。現在、別の言語で動作しますが、ColdFusionに移動する必要があります。私の一生の間、私は文字列を一致させることができません。どんな援助でも大歓迎です。

データ:https%3A%2F%2Fwww%2Etestwebsite%2Ecom%3Fid%3D5447
キー: 265D5C01D1B4C8FA28DC55C113B4D21005BB2B348859F674977B24E0F37C81B05FAE85FB75EA9CF53ABB9A174C59D98C7A61E2985026D2AA70AE4452A6E3F2F9

正解:WJd%2BKxmFxGWdbw4xQJZXd3%2FHkFQ%3d
私の答え:knIVr6wIt6%2Fl7mBJPTTbwQoTIb8%3d

どちらもBase64エンコードされてから、URLエンコードされます。

4

3 に答える 3

9

自分で HMAC-SHA1 のことをしています。私が言える最善のことは、この古い機能を見つけたということです。私がこれまで行ってきたことはうまくいっています。どこで見つけたのか忘れたので、作者の名前はわかりません。

Base 64 のものについては...暗号化でこの関数を実行し、返されたものに対して cfset newString = toBase64(oldString) を実行します。

<cffunction name="hmacEncrypt" returntype="binary" access="public" output="false">
   <cfargument name="signKey" type="string" required="true" />
   <cfargument name="signMessage" type="string" required="true" />
   <cfargument name="algorithm" type="string" default="HmacSHA1" />
   <cfargument name="charset" type="string" default="UTF-8" />

   <cfset var msgBytes = charsetDecode(arguments.signMessage, arguments.charset) />
   <cfset var keyBytes = charsetDecode(arguments.signKey, arguments.charset) />
   <cfset var keySpec = createObject("java","javax.crypto.spec.SecretKeySpec")  />
   <cfset var mac = createObject("java","javax.crypto.Mac") />

   <cfset key = keySpec.init(keyBytes, arguments.algorithm) />
   <cfset mac = mac.getInstance(arguments.algorithm) />
   <cfset mac.init(key) />
   <cfset mac.update(msgBytes) />

   <cfreturn mac.doFinal() />
</cffunction>
于 2010-06-02T18:03:32.503 に答える
4

文字列を出力する短い暗号化方法 (バーニーの方法に基づく):

<cffunction name="CFHMAC" output="false" returntype="string">
   <cfargument name="signMsg" type="string" required="true" />
   <cfargument name="signKey" type="string" required="true" />
   <cfargument name="encoding" type="string" default="utf-8" />
   <cfset var key = createObject("java", "javax.crypto.spec.SecretKeySpec").init(signKey.getBytes(arguments.encoding), "HmacSHA1") />
   <cfset var mac = createObject("java", "javax.crypto.Mac").getInstance("HmacSHA1") />
   <cfset mac.init(key) />
   <cfreturn toBase64(mac.doFinal(signMsg.getBytes(arguments.encoding))) />
</cffunction>

加えて

  1. ColdFusion 10 は、暗号化とハッシュのために HMAC-SHA1 をネイティブでサポートしています。
  2. Adobeが配布しているCF_HMACというライブラリがあります
  3. Amazon のファイルに署名する際に関連して HMAC を処理するライブラリがいくつかあります。その中には、cf-amazon-s3Barney's S3 URL Builder、およびRIAForge S3があります。
于 2012-08-21T18:56:17.467 に答える
1

スティーブ - ご回答ありがとうございます。私は実際にすでに hmacEncrypt 関数を使用していました。私は自分の問題を理解しました。文字列の代わりに HEX キーを渡していました。技術的には文字列であるため、キーを受け入れました。文字列に戻すために、上記の関数と一緒に別の関数を使用しました。以下は、HEX を文字列に変更します。私は以下の関数を書きませんでしたし、作者のクレジットを得るためにどこから来たのか覚えていませんが、うまくいきました.

<cffunction name="Hex2Bin" returntype="any" hint="Converts a Hex string to binary">
    <cfargument name="inputString" type="string" required="true" hint="The hexadecimal string to be written.">
    <cfset var outStream = CreateObject("java", "java.io.ByteArrayOutputStream").init()>
    <cfset var inputLength = Len(arguments.inputString)>
    <cfset var outputString = "">
    <cfset var i = 0>
    <cfset var ch = "">
    <cfif inputLength mod 2 neq 0>
    <cfset arguments.inputString = "0" & inputString>
    </cfif>
    <cfloop from="1" to="#inputLength#" index="i" step="2">
        <cfset ch = Mid(inputString, i, 2)>
        <cfset outStream.write(javacast("int", InputBaseN(ch, 16)))>
    </cfloop>
    <cfset outStream.flush()>
    <cfset outStream.close()> 
    <cfreturn outStream.toByteArray()>
</cffunction> 
于 2010-06-04T13:00:17.253 に答える