无法使用ColdFusion和HMAC-SHA1为API生成有效签名

时间:2016-10-04 03:37:36

标签: coldfusion

我已经完成了关于这个主题的一些其他相关帖子,并且能够毫无问题地复制它们。但是,无论我尝试做什么,我都无法使用自己的数据获得预期的签名结果。我非常感谢任何帮助。以下是API要求:

  1. 将数据转换为从ASCII字符串到字节数组的符号
  2. 将您的秘密访问密钥从Base64字符串转换为字节数组
  3. 使用步骤1中创建的字节数组作为HMAC-SHA1签名者的密钥
  4. 计算在步骤2中创建的字节数组的HMAC-SHA1哈希。结果将是一个字节数组
  5. 将步骤3中创建的字节数组转换为Base64编码字符串
  6. 根据文件:

    尽管尝试了其他帖子中的各种方法,但我无法获得该签名。例如:

    <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字符串,但我不确定。提前谢谢大家!

1 个答案:

答案 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)>