首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将PHP代码(对COLDFUSION散列进行编码)转换为WebServices

将PHP代码(对COLDFUSION散列进行编码)转换为WebServices
EN

Stack Overflow用户
提问于 2018-08-20 05:15:55
回答 1查看 149关注 0票数 4

我在一个ColdFusion站点上工作,该站点需要通过that服务与另一个系统通信。对于另一个系统,我有一个关于如何生成基于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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-20 06:20:14

这里有两个地方出错:

ColdFusion中的

  1. hmac()返回十六进制的哈希值。
  2. 在你想要散列的消息中有新的行(换行符) \n。ColdFusion不会自动转换它们。PHP是这样做的(当用双引号").

括起来时

解决方案:

在ColdFusion.

  • Use #chr(10)#中,
  1. 使用binaryDecode(hmac, "HEX")将哈希转换为二进制,而不是在ColdFusion中使用\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;

ColdFusion:

<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>
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51921905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档