最近一个项目的登录接口需要加密处理。考虑到HTTPS环境搭建以及后期各种维护和效率等因素,想要采用非对称加密RSA与对称加密算法AES相结合的方案。由于RSA加密数据量有限,而且速度相对较慢,因此用AES来加密数据,用RSA来传递AES密钥。
因为开发的是WebAPP,于是需要找一个RSA算法JS库。试了各种例子,忙活了一整天,还是没成功实现。最后找到了RSAjs,终于实现了功能。现在记录一下使用方法。
1.使用opensll工具生成私钥,并获取e:
OpenSSL> genrsa -out rsa_private_key.pem 1024
2.使用opensll工具从私钥中提取Modulus
rsa -in rsa_private_key.pem -noout -modulus
3.使用官方提供的demo进行测试
经过测试后,发现终于成了,于是提取关键代码
function do_encrypt(modulus, data) {
var value = "";
var rsa = new RSAKey();
rsa.setPublic(modulus, "10001");
var res = rsa.encrypt(data);
if(res) {
value = linebrk(hex2b64(res), 64);
}
return value;
}
该函数需要引入官方的js库
jsbn.js
prng4.js
rng.js
rsa.js
base64.js
使用时提示缺少函数hex2b64()还需要从官方例子引入该函数
function hex2b64(h) {
var b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var b64padchar="=";
var i;
var c;
var ret = "";
for(i = 0; i+3 <= h.length; i+=3) {
c = parseInt(h.substring(i,i+3),16);
ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);
}
if(i+1 == h.length) {
c = parseInt(h.substring(i,i+1),16);
ret += b64map.charAt(c << 2);
}
else if(i+2 == h.length) {
c = parseInt(h.substring(i,i+2),16);
ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);
}
while((ret.length & 3) > 0) ret += b64padchar;
return ret;
}