PHP hash_hmac sha256 遇到的坑 解决PHP与JAVA sha256结果不一致

在对接环信客服云验签时遇到一个坑,简单记录下

官方示例如下

第 2 步:根据Client Secret与待加密字符串计算signature

使用hmac-sha256加密,然后对其返回的原始二进制数据进行base64编码。

上述示例的计算结果为: yLgHjb8GckRpZ2uW8kb0qipODRkaFCIBNQsnZ2vhGMo=

Java 代码示例:

String secret = "02a0693ba5a57560df1f26a991204cb0";
String message = "POST\n/api/tenants/5950/rest/channels/20/messages\n1489490514142\n705bfbd388d2bf852813fc90e655b5ed";
final SecretKeySpec keySpec = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
final Mac mac = Mac.getInstance("HmacSHA256");
mac.init(keySpec);
final byte[] result = mac.doFinal(message.getBytes());
Base64.getEncoder().encodeToString(result);

其他代码示例:Examples of creating base64 hashes using HMAC SHA256 in different languages

PHP官方的示例如下:

$s = hash_hmac('sha256', 'Message', 'secret', true);
echo base64_encode($s);

 

但是结果怎么都对应不上,解决办法,是因为message里面有一个\n导致的,把单引号改为双引号就好使了,代码如下

$str = "POST\n/api/tenants/5950/rest/channels/20/messages\n1489490514142\n705bfbd388d2bf852813fc90e655b5ed";
$key = '02a0693ba5a57560df1f26a991204cb0';
$sig = hash_hmac("sha256", $str, $key, true);
echo $sig = base64_encode($sig); 

 

你可能感兴趣的:(Php)