最近开发了一个需求,后端用私钥对返回的数据进行加密,前端用对应的公钥进行解密。为什么会这样呢?因为后端返回的数据有手机号、身份证号等明文数据,公司出于安全考虑,所以要对这样的接口进行安全改造。
因为之前,前端在项目中有使用wxapp_rsa.js进行公钥加密,后端私钥解密这样的功能,所以我就尝试用wxapp_rsa.js去解密,但是如果前端私钥解密的话,就会存在私钥泄露的情况,所以最后就定义为后端私钥加密,前端公钥解密。
真正去开发需求的时候还是遇到了很多问题,下面我会一一道来。
一、前后端确定加密的方式,后端加密,前端解密
出于安全考虑,后端私钥加密,前端公钥解密(虽然这不符合常规,一般都是公钥加密,私钥解密或者验签的时候,私钥加密,公钥验签)
二、前端公钥解密,wxapp_rsa.js有私钥解密的方法,没有公钥解密的方法,需要对wxapp_rsa.js这个插件进行改造。
改造如下:
1、修改RSADecrypt函数
function RSADecrypt(b) {
var d = parseBigInt(b, 16);
// 这里doPrivate修改为doPublic
// var m = this.doPrivate(d);
var a = this.doPublic(d);
if (a == null) {
return null
}
return pkcs1unpad2(a, (this.n.bitLength() + 7) >> 3)
}
2、修改pkcs1unpad2函数
function pkcs1unpad2(g, j) {
var a = g.toByteArray();
var f = 0;
while (f < a.length && a[f] == 0) {
++f
}
// // 这里将如下三行代码注释
// if (a.length - f != j - 1 || a[f] != 2) {
// return null
// }
++f;
while (a[f] != 0) {
if (++f >= a.length) {
return null
}
}
var e = "";
while (++f < a.length) {
var h = a[f] & 255;
if (h < 128) {
e += String.fromCharCode(h)
} else {