mpvue 小程序RSA加密(jsencrypt)

最近做的项目中需要使用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中的使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值