我已经完成了关于这个主题的一些其他相关帖子,并且能够毫无问题地复制它们。但是,无论我尝试做什么,我都无法使用自己的数据获得预期的签名结果。我非常感谢任何帮助。以下是API要求:
根据文件:
尽管尝试了其他帖子中的各种方法,但我无法获得该签名。例如:
<cffunction name="hmacEncrypt" returntype="binary" access="public" output="false">
<cfargument name="base64Key" type="string" required="true" default="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==">
<cfargument name="signMessage" type="string" required="true" default="http://membersuite.com/contracts/IConciergeAPIService/WhoAmI00000000-0000-0000-0000-00000000000011111111-1111-1111-1111-111111111111">
<cfargument name="encoding" type="string" default="UTF-8">
<cfset var messageBytes = JavaCast("string",arguments.signMessage).getBytes(arguments.encoding)>
<cfset var keyBytes = binaryDecode(arguments.base64Key, "base64")>
<cfset var key = createObject("java","javax.crypto.spec.SecretKeySpec")>
<cfset var mac = createObject("java","javax.crypto.Mac")>
<cfset key = key.init(keyBytes,"HmacSHA512")>
<cfset mac = mac.getInstance(key.getAlgorithm())>
<cfset mac.init(key)>
<cfset mac.update(messageBytes)>
<cfreturn mac.doFinal()>
</cffunction>
转储该函数的输出不会给我任何错误,但它也不会与预期的输出匹配。再次,我将非常感谢任何协助或推动正确的方向。我认为我的部分麻烦在于我如何编码密钥和URL字符串,但我不确定。提前谢谢大家!
答案 0 :(得分:3)
key.init(keyBytes,"HmacSHA512")
几乎。 UDF被硬编码为使用“HmacSHA512”。将其更改为“HmacSHA1”,或者更好,将其设置为“编码”之类的函数参数。
示例:强>
<cfset action = "http://membersuite.com/contracts/IConciergeAPIService/WhoAmI">
<cfset associationId = "00000000-0000-0000-0000-000000000000">
<cfset sessionId = "11111111-1111-1111-1111-111111111111">
<cfset stringToSign = action & associationId & sessionId>
<cfset key = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==">
<cfset result = binaryEncode(hmacEncrypt(key, stringToSign, "US-ASCII"), "base64")>
<cfset writeDump(result)>
<强>结果:强>
2zsMYdHb/MJUeTjv5cQl5pBuIqU=
NB:自CF10 +起,HMAC是现在的核心功能:
<cfset resultAsHex = hmac(stringToSign, binaryDecode(key, "base64"), "hmacsha1", "us-ascii")>
<cfset resultAsBase64 = binaryEncode(binaryDecode(resultAsHex, "hex"), "base64")>
<cfset writeDump(resultAsBase64)>