(代码间接看文末)
工作上有需要须要开发钉钉宜搭的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-8import hmacimport base64import hashlibappsecret = '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)
加密后果和文档给的实例统一