最近一個(gè)項(xiàng)目的登錄接口需要加密處理。考慮到HTTPS環(huán)境搭建以及后期各種維護(hù)和效率等因素,想要采用非對稱加密RSA與對稱加密算法AES相結(jié)合的方案拜效。由于RSA加密數(shù)據(jù)量有限喷众,而且速度相對較慢,因此用AES來加密數(shù)據(jù)紧憾,用RSA來傳遞AES密鑰到千。
因?yàn)殚_發(fā)的是WebAPP,于是需要找一個(gè)RSA算法JS庫赴穗。試了各種例子憔四,忙活了一整天,還是沒成功實(shí)現(xiàn)般眉。最后找到了RSAjs了赵,終于實(shí)現(xiàn)了功能。現(xiàn)在記錄一下使用方法甸赃。
1.使用opensll工具生成私鑰柿汛,并獲取e:
OpenSSL> genrsa -out rsa_private_key.pem 1024
2.使用opensll工具從私鑰中提取Modulus
rsa -in rsa_private_key.pem -noout -modulus
3.使用官方提供的demo進(jìn)行測試
經(jīng)過測試后,發(fā)現(xiàn)終于成了埠对,于是提取關(guān)鍵代碼
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;
}
該函數(shù)需要引入官方的js庫
jsbn.js
prng4.js
rng.js
rsa.js
base64.js
使用時(shí)提示缺少函數(shù)hex2b64()還需要從官方例子引入該函數(shù)
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;
}