php - 将 PHP 代码(以编码 WebServices API HASH)转换为 COLDFUSION

标签 php encoding coldfusion sha512

我正在开发一个 ColdFusion 站点,该站点需要通过 Web 服务与另一个系统对话。对于另一个系统,我在 PHP 中有一个关于如何生成基于 SHA512 的哈希的示例,我试图在 ColdFusion 中复制相同的函数,但它就是不起作用。

示例包括一个字符串和 key ,以及预期的编码结果。但是我没有得到与 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>

最佳答案

这里有两处错误:

    ColdFusion 中的
  1. hmac() 返回十六进制的散列。 PHP 中的 hmac(..., true) 以二进制形式返回散列。
  2. 您要散列的消息中有新行(换行符)\n。 ColdFusion 不会自动转换它们。 PHP 可以(当包含在双引号 " 中时)。

解决方法:

  1. 使用 binaryDecode(hmac, "HEX") 在 ColdFusion 中将散列转换为二进制。
  2. 在 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>

关于php - 将 PHP 代码(以编码 WebServices API HASH)转换为 COLDFUSION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51921905/

相关文章:

php - 如何从选择框中选择多个选项

python - Mechanize :第一种形式有效,然后是 "unknown GET form encoding type ' utf- 8'"

c - 编码解码字节

iOS objective-C NSData 到 NSString 返回 nil,如何忽略无效的 UTF-8

coldfusion - 您能否隔离代码,使其不被 CF10 编译器看到?

ColdFusion 未正确解释 CFDirectory 中的日期时间

php - DELETE FROM table WHERE IN() 准备语句仅删除数组的第一个值

php - 解析 JSON 以在 PHP 中创建 SQL 插入语句

mysql - Coldfusion Lucee 4.5.2.018 (Linux) - REST 服务(无法转换字符串)JSON

php - 删除 simplexmlelement 节点