最近做的项目中需要使用RSA加密,尝试过了很多种方式,发现都是需要改源码,最终敲定使用jsencrypt。
安装依赖
npm install jsencrypt --save
使用
作为vue组件使用:
import { JSEncrypt } from 'jsencrypt'
getRSApassword () {
let publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpaHJpuNOEV27Tlw/vprb3GYw41qw8qmR62XDDCMVkD8Opht27q6+1VXJGkViqo97oulczQ7FdHVk75uoA9GqgeBm4o4LrFg/1EYlH56qyZwwjMs8mizEit9FI/2Ub1al2xJzvRcFz/8YxxA2A9FP30+JjFtzUvzORbbYVm7A5iQIDAQAB'
let encryptor = new JSEncrypt()
encryptor.setPublicKey(publicKey)
let rsaPassWord = encryptor.encrypt('121')
console.log(rsaPassWord)
}
生成密钥对:
generateKeys () {
var crypt = new JSEncrypt({ default_key_size: 1024 })
crypt.getKey()
var publicKey = crypt.getPublicKey()
var privateKey = crypt.getPrivateKey()
console.log(publicKey)
console.log(privateKey)
// 去除-----*** 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, '')
console.log(publicKey)
// 返回生成的秘钥对
return [publicKey, privateKey]
}
更改源码
由于 jsencrypt.js 对浏览器做了兼容,直接引用会在小程序中报错,所以需要修改 jsencrypt.js ,做兼容处理。
(1)navigator.appName
使用的时候会报下面的错
Uncaught TypeError: Cannot read property 'appName' of undefined
源码
if (j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
BigInteger.prototype.am = am2;
dbits = 30;
}
else if (j_lm && (navigator.appName != "Netscape")) {
BigInteger.prototype.am = am1;
dbits = 26;
}
else { // Mozilla/Netscape seems to prefer am3
BigInteger.prototype.am = am3;
dbits = 28;
}
解决方法:
可以保留最后else中的,其余删掉navigator主要是对浏览器的判断,小程序中会报错。
BigInteger.prototype.am = am3;
dbits = 28;
(1)window.removeEventListener、window.detachEvent
源码:
if (window.removeEventListener) {
window.removeEventListener("mousemove", onMouseMoveListener_1, false);
}
else if (window.detachEvent) {
window.detachEvent("onmousemove", onMouseMoveListener_1);
}
解决方法:
直接删掉,监听的事件不会影响到加密和解密
(3)window.crypto
if (window.crypto && window.crypto.getRandomValues) {
// Extract entropy (2048 bits) from RNG if available
var z = new Uint32Array(256);
window.crypto.getRandomValues(z);
for (t = 0; t < z.length; ++t) {
rng_pool[rng_pptr++] = z[t] & 255;
}
}
解决方法:
代码作用:// 生成长度为256,元素随机值的数组
删掉,加上下面代码
var getRandomValues = function (array) {
for (var i = 0, l = array.length; i < l; i++) {
array[i] = Math.floor(Math.random() * 256);
} return array;
}
var z = new Uint32Array(256);
getRandomValues(z);
修改了以上三点内容之后,小程序加密基本可用。
参考资料:
小程序加密jsencrypt.js使用 Uncaught TypeError: Cannot read property ‘appName’ of undefined 已解决
jsencrypt在vue中的使用