请帮帮我!我一直在为这件事拔掉头发。:)
我有一个网站,我需要HMAC SHA1认证。它目前支持另一种语言,但现在我需要将其迁移到ColdFusion。我无论如何也找不到匹配的字符串。任何帮助都将不胜感激。
数据:https%3A%2F%2Fwww%2Etestwebsite%2Ecom%3Fid%3D5447
密钥:265D5C01D1B4C8FA28DC55C113B4D21005BB2B348859F674977B24E0F37C81B05FAE85FB75EA9CF53ABB9A174C59D98C7A61E2985026D2AA70AE4452A6E3F2F9
正确答案:WJd%2BKxmFxGWdbw4xQJZXd3%2FHkFQ%3d
我的答案是:knIVr6wIt6%2Fl7mBJPTTbwQoTIb8%3d
两者都是先进行Base64编码,然后再进行URL编码。
发布于 2010-06-03 02:03:33
我自己也在做HMAC-SHA1的事情。我能说的就是我找到了这个旧函数。到目前为止,我所做的一切都很好。我忘了在哪里找到它了,所以我不能相信作者。
对于你的Base64的东西...对加密运行此函数,然后对返回的内容执行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>发布于 2012-08-22 02:56:17
一种较短的加密方法(基于Barney's method),可输出字符串:
<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>此外
亚马逊
、cf-amazon-s3、Barney's S3 URL Builder
发布于 2010-06-04 21:00:17
Steve -感谢您的回复。我实际上已经在使用hmacEncrypt函数了。不过,我确实弄清楚了我的问题。我传入的是十六进制密钥,而不是字符串。它接受了密钥,因为从技术上讲,它是一个字符串。为了让它返回到字符串,我使用了另一个函数以及上面的一个函数。下面的代码将十六进制转换为字符串。我没有写下面的函数,也不记得它是从哪里来的,以获得作者的信任,但它工作得很好。
<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> https://stackoverflow.com/questions/2959972
复制相似问题