最近公司做一个对接遗留系统的UI,由于老系统的REST API格式非常奇葩,我们决定写一个所谓的sdk来封装一些纯业务逻辑的API调用。其中有一个模块用到了access token的交互,需要做3DES和RSA的加密,解密。
本来我对一些加解密算法也不是很熟悉,只要OpenSSL会用到RSA算法,但算法具体是咋样的,还真没研究过,这里也不会提及。这里主要是记录一下在使用JavaScript做这些算法时遇到的坑。
先说3DES相关的,业务逻辑其实比较简单,就是Server发来一个加密过的base64字符串,由Client端用3DES算法来解密。Clinet预置了key,看似直接解密就可以。上网找了一下JavaScript对于3DES算法的库,大多数人建议用crypto-js。这里的问题是crypto-js文档不够详尽,很多参数没有说清楚到底如何处理。
直接上代码来解释
const CryptoJS = require('crypto-js');
const iv = CryptoJS.enc.Utf8.parse('01234567');
const options = {
iv,
padding: CryptoJS.pad.Pkcs7,
mode: CryptoJS.mode.CBC
};
exports.decrypt = (secret, key) => {
const utf8Key = CryptoJS.enc.Utf8.parse(key);
const decrypted = CryptoJS.TripleDES.decrypt(secret, utf8Key, options);
return CryptoJS.enc.Utf8.stringify(decrypted);
};
exports.encrypt = (plaintext, key) => { <