微信小程序加签验签(wxapp_rsa,jsencrypt)和egg搭建的后端交互(jsrsasign,node_rsa)最全!!!
RAS加密
RSA加密算法是一种非对称加密算法。
假设 A 与 B 通信。A 和 B 都提供一个公开的公钥。A 把需要传递的信息,先用自己的私钥签名,再用 B 的公钥加密。B 接收到这串密文后,用自己的私钥解密,用 A 提供的公钥验签。
为什么要先签名后加密?如果你先加密后签名,非法用户通过获取的公钥就可以破解签名,破解之后就可以替换签名。
数字签名
功能:保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。
作用:数字签名的文件的完整性是很容易验证的(不需要骑缝章,骑缝签名,也不需要笔迹专家),而且数字签名具有不可抵赖性(不可否认性)。
数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。
如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。
发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要。
接着再用发送方的公用密钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该数字签名是发送方的。
小程序端
jsEncrypt.js介绍
功能
一种RSA加密的解决方案。 这种加密模式被称为"非对称加密算法"。
(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
(2)甲方获取乙方的公钥,然后用它对信息加密。
(3)乙方得到加密后的信息,用私钥解密。
如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。
jsencrypt源码不支持小程序端需要做一定的兼容处理,可查看: jsencrypt小程序兼容处理或直接在此处下载已兼容和压缩后的jsencrypt,将js文件加入到小程序根目录的/utils
文件夹下
第一步: 客户端获取公钥和私钥
// app根目录/util/create_rsa.js
const Encrypt = require('./jsencrypt.min.js')
//生成公钥和私钥
export function generateKeys() {
var crypt = new Encrypt({
default_key_size: 2048 //设置秘钥的长度需要和服务器端保持一致
});
crypt.getKey();
var publicKey = crypt.getPublicKey();
var privateKey = crypt.getPrivateKey();
// 去除-----*** RSA **** KEY----- 和空格换行
// publicKey = (publicKey.split('-----'))[2];
// publicKey = publicKey.replace(/\n/g, "").replace(/\r/g, "").replace(/\t/g, "").replace(/\s*/g, "");
// privateKey = (privateKey.split('-----'))[2];
// privateKey = privateKey.replace(/\n/g, "").replace(/\r/g, "").replace(/\t/g, "").replace(/\s*/g, "");
// 返回生成的秘钥对
return [publicKey, privateKey];
}
export const [publicKey, privateKey] = generateKeys();
wxapp_rsa加签和验签
第二步: 待传输数据的加签和验签
这里使用这个库: wxapp_rsa (相关代码可以直接参考github)
这里下载签名需要的js文件wxapp.rsa.js
// app根目录下/utils/rsa.js
const {
publicKey, privateKey} = require('./create_rsa.js')
const RSA = require('./wxapp_rsa.js')
// 使用客户端私钥加签
export function sign(data) {
var si