将 PHP 代码(对 WebServices API HASH 进行编码)转换为 COLDFUSION
Converting PHP code (to encode a WebServices API HASH) to COLDFUSION
我正在开发一个需要通过 Web 服务与另一个系统对话的 ColdFusion 站点。对于另一个系统,我在 PHP 中有一个关于如何生成基于 SHA512 的哈希的示例,我试图在 ColdFusion 中复制相同的函数,但它只是不起作用。
示例包括一个字符串和密钥,以及预期的编码结果。但是我没有得到与 ColdFusion 相同的编码字符串。也许我在某处缺少 ToBase64 或其他转换函数,但我没有想法,真的需要帮助才能让它工作。
如有任何帮助,我们将不胜感激。
这是 PHP 示例代码
//signature to acquire a session
$apiId = '1lie8ficql9h5';
$apiSecret = 'j6hriaKY2iZi+Y2uo9JJldmO1Bq79XB8d1v2uHzAK0Zvy972mIs8ThsJSQeDlZJz+HzmLD6Q1MUZb5X1Zf9MzQ==';
//build the string to sign
//note the order of the entries is important.
//The http headers must be in alphabetical order by key name
$httpMethod = 'POST';
$apiKey = 'x-csod-api-key:'.$apiId;
$httpUrl = '/services/api/sts/session';
date_default_timezone_set('UTC');
$date = 'x-csod-date:'.date('Y-m-d').'T'.date('H:i:s').'.000';
$stringToSign = $httpMethod."\n".$apiKey."\n".$date."\n".$httpUrl;
/* produces the following string:
* POST\nx-csod-api-key:1lie8ficql9h5\nx-csod-date:2015-09-08T11:27:32.000\n/services/api/sts/session
*/
//Generate the signature
$secretKey = base64_decode($apiSecret);
$signature = base64_encode(hash_hmac('sha512', $stringToSign, $secretKey, true));
/*
* signature produced:
* 3x5ETGSoqJa4vLl8gOFzdhxReOS0k8Nk2CpKVFN2A60ItF8wfP2tr+GUY2mELXjL90B57B5imLIrzou3ZQMfqQ==
*/
这是我的 ColdFusion 代码,但它没有生成相同的编码字符串:
<cfoutput>
<cfset api_id= "1lie8ficql9h5">
<cfset api_secret= "j6hriaKY2iZi+Y2uo9JJldmO1Bq79XB8d1v2uHzAK0Zvy972mIs8ThsJSQeDlZJz+HzmLD6Q1MUZb5X1Zf9MzQ==">
<cfset api_string= "POST\nx-csod-api-key:1lie8ficql9h5\nx-csod-date:2015-09-08T11:27:32.000\n/services/api/sts/session">
<cfset temp_key= ToString(ToBinary( api_secret))>
<cfset temp_signature= HMAC( api_string, temp_key, "HMACSHA512", "UTF-8")>
<cfset temp_signature1= ToBase64( temp_signature)>
api_string:<br> #api_string#<br><br>
temp_signature:<br> #temp_signature#<br>
temp_signature1:<br> #temp_signature1#<br><br>
EXPECTED: (Copied from the PHP Sample code)<br>
3x5ETGSoqJa4vLl8gOFzdhxReOS0k8Nk2CpKVFN2A60ItF8wfP2tr+GUY2mELXjL90B57B5imLIrzou3ZQMfqQ==
</cfoutput>
这里有两处错误:
hmac()
在 ColdFusion 中 returns 十六进制的散列。 hmac(..., true)
in PHP returns 哈希为二进制。
- 您要散列的邮件中有新行(换行符)
\n
。 ColdFusion 不会自动转换它们。 PHP 会(当用双引号引起来时 "
)。
解决方案:
- 在 ColdFusion 中使用
binaryDecode(hmac, "HEX")
将散列转换为二进制。
- 在 ColdFusion 中使用
#chr(10)#
而不是 \n
。
这是两种语言的版本:
PHP:
$apiSecret = 'j6hriaKY2iZi+Y2uo9JJldmO1Bq79XB8d1v2uHzAK0Zvy972mIs8ThsJSQeDlZJz+HzmLD6Q1MUZb5X1Zf9MzQ==';
$stringToSign = "POST\nx-csod-api-key:1lie8ficql9h5\nx-csod-date:2015-09-08T11:27:32.000\n/services/api/sts/session";
$secretKey = base64_decode($apiSecret);
$signature = base64_encode(
hash_hmac('sha512', $stringToSign, $secretKey, true)
);
echo $signature;
冷聚变:
<cfset apiSecret = 'j6hriaKY2iZi+Y2uo9JJldmO1Bq79XB8d1v2uHzAK0Zvy972mIs8ThsJSQeDlZJz+HzmLD6Q1MUZb5X1Zf9MzQ=='>
<cfset stringToSign = 'POST#chr(10)#x-csod-api-key:1lie8ficql9h5#chr(10)#x-csod-date:2015-09-08T11:27:32.000#chr(10)#/services/api/sts/session'>
<cfset secretKey = toBinary(apiSecret)>
<cfset signature = toBase64(
binaryDecode(
hmac(stringToSign, secretKey, 'HMACSHA512'),
'HEX'
)
)>
<cfoutput>#signature#</cfoutput>
我正在开发一个需要通过 Web 服务与另一个系统对话的 ColdFusion 站点。对于另一个系统,我在 PHP 中有一个关于如何生成基于 SHA512 的哈希的示例,我试图在 ColdFusion 中复制相同的函数,但它只是不起作用。
示例包括一个字符串和密钥,以及预期的编码结果。但是我没有得到与 ColdFusion 相同的编码字符串。也许我在某处缺少 ToBase64 或其他转换函数,但我没有想法,真的需要帮助才能让它工作。
如有任何帮助,我们将不胜感激。
这是 PHP 示例代码
//signature to acquire a session
$apiId = '1lie8ficql9h5';
$apiSecret = 'j6hriaKY2iZi+Y2uo9JJldmO1Bq79XB8d1v2uHzAK0Zvy972mIs8ThsJSQeDlZJz+HzmLD6Q1MUZb5X1Zf9MzQ==';
//build the string to sign
//note the order of the entries is important.
//The http headers must be in alphabetical order by key name
$httpMethod = 'POST';
$apiKey = 'x-csod-api-key:'.$apiId;
$httpUrl = '/services/api/sts/session';
date_default_timezone_set('UTC');
$date = 'x-csod-date:'.date('Y-m-d').'T'.date('H:i:s').'.000';
$stringToSign = $httpMethod."\n".$apiKey."\n".$date."\n".$httpUrl;
/* produces the following string:
* POST\nx-csod-api-key:1lie8ficql9h5\nx-csod-date:2015-09-08T11:27:32.000\n/services/api/sts/session
*/
//Generate the signature
$secretKey = base64_decode($apiSecret);
$signature = base64_encode(hash_hmac('sha512', $stringToSign, $secretKey, true));
/*
* signature produced:
* 3x5ETGSoqJa4vLl8gOFzdhxReOS0k8Nk2CpKVFN2A60ItF8wfP2tr+GUY2mELXjL90B57B5imLIrzou3ZQMfqQ==
*/
这是我的 ColdFusion 代码,但它没有生成相同的编码字符串:
<cfoutput>
<cfset api_id= "1lie8ficql9h5">
<cfset api_secret= "j6hriaKY2iZi+Y2uo9JJldmO1Bq79XB8d1v2uHzAK0Zvy972mIs8ThsJSQeDlZJz+HzmLD6Q1MUZb5X1Zf9MzQ==">
<cfset api_string= "POST\nx-csod-api-key:1lie8ficql9h5\nx-csod-date:2015-09-08T11:27:32.000\n/services/api/sts/session">
<cfset temp_key= ToString(ToBinary( api_secret))>
<cfset temp_signature= HMAC( api_string, temp_key, "HMACSHA512", "UTF-8")>
<cfset temp_signature1= ToBase64( temp_signature)>
api_string:<br> #api_string#<br><br>
temp_signature:<br> #temp_signature#<br>
temp_signature1:<br> #temp_signature1#<br><br>
EXPECTED: (Copied from the PHP Sample code)<br>
3x5ETGSoqJa4vLl8gOFzdhxReOS0k8Nk2CpKVFN2A60ItF8wfP2tr+GUY2mELXjL90B57B5imLIrzou3ZQMfqQ==
</cfoutput>
这里有两处错误:
hmac()
在 ColdFusion 中 returns 十六进制的散列。hmac(..., true)
in PHP returns 哈希为二进制。- 您要散列的邮件中有新行(换行符)
\n
。 ColdFusion 不会自动转换它们。 PHP 会(当用双引号引起来时"
)。
解决方案:
- 在 ColdFusion 中使用
binaryDecode(hmac, "HEX")
将散列转换为二进制。 - 在 ColdFusion 中使用
#chr(10)#
而不是\n
。
这是两种语言的版本:
PHP:
$apiSecret = 'j6hriaKY2iZi+Y2uo9JJldmO1Bq79XB8d1v2uHzAK0Zvy972mIs8ThsJSQeDlZJz+HzmLD6Q1MUZb5X1Zf9MzQ==';
$stringToSign = "POST\nx-csod-api-key:1lie8ficql9h5\nx-csod-date:2015-09-08T11:27:32.000\n/services/api/sts/session";
$secretKey = base64_decode($apiSecret);
$signature = base64_encode(
hash_hmac('sha512', $stringToSign, $secretKey, true)
);
echo $signature;
冷聚变:
<cfset apiSecret = 'j6hriaKY2iZi+Y2uo9JJldmO1Bq79XB8d1v2uHzAK0Zvy972mIs8ThsJSQeDlZJz+HzmLD6Q1MUZb5X1Zf9MzQ=='>
<cfset stringToSign = 'POST#chr(10)#x-csod-api-key:1lie8ficql9h5#chr(10)#x-csod-date:2015-09-08T11:27:32.000#chr(10)#/services/api/sts/session'>
<cfset secretKey = toBinary(apiSecret)>
<cfset signature = toBase64(
binaryDecode(
hmac(stringToSign, secretKey, 'HMACSHA512'),
'HEX'
)
)>
<cfoutput>#signature#</cfoutput>