下面是针对“nodejs 实现钉钉ISV接入的加密解密方法”的攻略:
1. 了解加密解密流程
钉钉开放平台的接口数据传输是加密的,因此我们需要实现加密,解密的逻辑来完成与钉钉服务器的交互。在实现前,我们需要了解这个流程。
- 接口请求方产生随机字符串nonce
- 接口请求方使用自己的appSecret和钉钉开放平台的suiteTicket产生签名signature
- 接口请求方将nonce、timestamp、suiteTicket等参数加密发送给钉钉服务端
- 钉钉服务端使用自己的suiteSecret和appKey解密获取这些参数,并验证签名合法性
- 钉钉服务端使用自己的suiteSecret和appKey加密数据返回给接口请求方
- 接口请求方使用自己的appSecret和钉钉开放平台的suiteTicket解密数据得到结果
2. 实现加密解密逻辑
在了解了加密解密流程之后,接下来我们需要实现这个逻辑。下面是Nodejs实现的代码示例:
加密方法
const crypto = require("crypto");
/**
* 加密并签名数据
* @param {string} plainText - 需要加密的数据
* @param {string} appSecret - 应用的AppSecret
* @param {string} suiteTicket - 钉钉开放平台的SuiteTicket
* @return {string} - 加密后的内容
*/
function encrypt(plainText, appSecret, suiteTicket) {
const cipher = crypto.createCipheriv("aes-256-cbc", appSecret, suiteTicket);
let cipherText = cipher.update(plainText, "utf8", "base64");
cipherText += cipher.final("base64");
return cipherText;
}
解密方法
const crypto = require("crypto");
/**
* 解密并验证签名
* @param {string} cipherText - 需要解密的数据
* @param {string} appSecret - 应用的AppSecret
* @param {string} suiteTicket - 钉钉开放平台的SuiteTicket
* @param {string} signature - 签名
* @return {string|null} - 解密后的内容,解密失败则返回null
*/
function decrypt(cipherText, appSecret, suiteTicket, signature) {
// 验证签名是否正确
if (signature !== generateSignature(cipherText, appSecret, suiteTicket)) {
return null;
}
const decipher = crypto.createDecipheriv("aes-256-cbc", appSecret, suiteTicket);
try {
let plainText = decipher.update(cipherText, "base64", "utf8");
plainText += decipher.final("utf8");
return plainText;
} catch (err) {
console.log(err);
return null;
}
}
这里我们使用 Nodejs 自带的 crypto 模块进行加解密,使用 AES-256-CBC 算法进行加密解密。
3. 示例说明
示例一
我们假设我们有以下数据需要发送到钉钉服务器:
{
"name": "张三",
"age": 25,
"job": "Web开发工程师"
}
接下来我们需要将这个数据加密并发送:
const appSecret = "你的APP Secret";
const suiteTicket = "钉钉开放平台的SuiteTicket";
// 产生随机字符串作为nonce
const nonce = "123456";
// 产生timestamp
const timestamp = Date.now();
// 加密数据
const plainText = JSON.stringify({
name: "张三",
age: 25,
job: "Web开发工程师",
});
const cipherText = encrypt(plainText, appSecret, suiteTicket);
// 产生签名
const signature = generateSignature(cipherText, appSecret, suiteTicket);
// 将nonce、timestamp、加密后的数据和签名发送给钉钉服务器
const postData = {
Encrypt: cipherText,
Signature: signature,
TimeStamp: timestamp,
nonce,
};
// 发送postData到钉钉服务器
示例二
钉钉服务器返回的数据需要我们进行解密,例如我们得到以下数据:
{
"Encrypt": "iN58s....CRs2Wd",
"TimeStamp": 1590111411414,
"Signature": "9e04d3...c2ee",
"SuiteKey": "suite4xxxxxxxxxxxxxxx"
}
我们需要使用我们的应用的AppSecret和钉钉开放平台的SuiteTicket进行解密,并验证签名:
const appSecret = "你的APP Secret";
const suiteTicket = "钉钉开放平台的SuiteTicket";
const { Encrypt, TimeStamp, Signature } = data;
// 解密数据
const plainText = decrypt(Encrypt, appSecret, suiteTicket, Signature);
// 使用解密的结果进行业务逻辑处理
if (plainText) {
const { name, age, job } = JSON.parse(plainText);
console.log(name, age, job);
} else {
console.log("签名验证失败或解密失败");
}
这里我们可以根据明文数据进行业务逻辑处理,例如输出 name、age 和 job。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs 实现钉钉ISV接入的加密解密方法 - Python技术站