关于javascript:解决nodejs加密hmacSha256签名结果与pythonphpjava端结果不一致问题

102次阅读

共计 2063 个字符,预计需要花费 6 分钟才能阅读完成。

(代码间接看文末)
工作上有需要须要开发钉钉宜搭的 OPEN API,
然而宜搭文档里只提供了 python2、php、java 端的 SDK 和 demo,
如果要用 node 端拜访必须参考开发。
宜搭旧版本文档 (签名加密形式只能在旧版本看到)
其中有一项 signiture,须要应用 hmacSha256 对申请内容及密钥进行加密,
文档提供了加密实例供测试

数据源(略过拼装流程):

// 待加密字符串,其中 \n 示意换行符
POST\n2021-03-01T10:32:05.013+08:00\n5115005259072592999\n/yida_epaas/demo.json\nid=8372622123&name= 宜搭 EPAAS  

// 密钥
nCppz97dD5k4wRA6hWesV1Amv56wHL3x8VicV5Fu

伪代码:

Signature=base64(HmacSha256(SecretKey, bytesToSign);

加密后果:

j9jIeBkuEJOk4h5df9oT3/PIHcvhozqWYvAO/PtKrYI=

其中用 3 个示例中自己仅会的 python3 测试是能够胜利加密出上述加密后果的
python 代码(加密局部):

# coding=UTF-8
import hmac
import base64
import hashlib
appsecret = 'nCppz97dD5k4wRA6hWesV1Amv56wHL3x8VicV5Fu'
data = 'POST\n2021-03-01T10:32:05.013+08:00\n5115005259072592999\n/yida_epaas/demo.json\nid=8372622123&name= 宜搭 EPAAS'
dig = hmac.new(appsecret, data, digestmod=hashlib.sha256).digest()
sign = base64.b64encode(dig)
print(sign)

而官网没有提供的 nodejs 加密,则依照网上大家采纳的 crypto-js 的办法

var HmacSha256 = require('crypto-js/hmac-sha256') ;
var Base64 = require('crypto-js/enc-base64');
const bytesToSign = `POST\n2021-03-01T10:32:05.013+08:00\n5115005259072592999\n/yida_epaas/demo.json\nid=8372622123&name= 宜搭 EPAAS`;
const SecretKey = 'nCppz97dD5k4wRA6hWesV1Amv56wHL3x8VicV5Fu';
let Hmac = HmacSha256(SecretKey,bytesToSign);
const  Authorization = Base64.stringify(Hmac);
console.log(Authorization);
//TSs+1ffZ6OjOr5MvESKrkJ8gVoo39f37S8w+yb6m5K0=

后果并不统一。
有图有假相:

网上一部分文章和下面的加密形式一样,而后还硬说 python 和 node 计算结果一样,预计本人也没试过。
排除了一堆无意义文章之后,在一个机翻的页面找到答案 (原答复懒得找了)
Node.js 加密与 Python Hashlib
文中提到,都计算 sha512 值后,尽管看着输入不一样,但如果将 node 和 python 输入的后果都解码为 Latin-1 会发现可打印局部,两边是统一的。
所以他们计算 sha512 后,差别理论在于:
node 的 digest()返回了 Unicode 字符串, 而 Python 的则返回了 bytes 对象。

所以,下面的签名只有在计算 sha256 后,node 端多加一步,将后果转为 bytes 对象就能够了。
而因为 crypto-js 的 hmac-sha256 计算后的后果是自订的两头类型,我不晓得两头该怎么转,因而我应用回 node 自带的 crypto:

const crypto = require('crypto');
const bytesToSign = `POST\n2021-03-01T10:32:05.013+08:00\n5115005259072592999\n/yida_epaas/demo.json\nid=8372622123&name= 宜搭 EPAAS`;
const SecretKey = 'nCppz97dD5k4wRA6hWesV1Amv56wHL3x8VicV5Fu';

const hmac = crypto.createHmac('sha256', SecretKey);
hmac.update(bytesToSign);
let Hmac = hmac.digest('bytes');
const Authorization = Hmac.toString('base64')
console.log(Authorization)

加密后果和文档给的实例统一

正文完
 0