在对接环信客服云验签时遇到一个坑,简单记录下
官方示例如下
第 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);