uniapp中使用rsa(jsencrypt)加密报错的问题
近期在uniapp中使用rsa加密,但总是报错。报错如下
reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Exception: ReferenceError: Can't find variable: navigator
__webpack_require__@weex createInstanceContext:79:34
以上报错仅仅只是供参考,因为可能报错的信息可能会不一样,我这里报错信息大概总结为navigator这个对象找不到。 一、.环境 我在uniapp 上安装的rsa加密插件是'jsencrypt',使用npm安装
二、现象 用uniapp开发的时候,在网页预览是没问题的,因为网页包含DOM和BOM以及Window对象。rsa加密会获取window对象,所以浏览器预览是没问题的。但是如果你一旦编译在安卓上或者编译在小程序上,此时问题就会出现了。就会发生类似以上的报错 三、分析原因 造成这样的原因是因为rsa加密获取的window对象,在安卓上或者小程序上是找不到的,因为小程序或者安卓端是不存在Window对象的 四、解决方案 在node_modules中找到jsencrypt/bin/jsencrypt.js目录 如下
文章图片
QQ截图20200328104635.png ;
打开jsencrypt.js 在代码中找到'use strict'; 在这句严格模式代码下一行插入
// 用来替换 navigator
var navigator2 = {
appName: 'Netscape',
userAgent: 'Mozilla/5.0 (iPhone;
CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
};
//用来替换window
var window2 = {
ASN1: null,
Base64: null,
Hex: null,
crypto: null,
href: null
};
如下图
文章图片
QQ截图20200328104833.png 将上面的代码放入后,然后ctrl+f搜索当前js文件中的window和navigator ,分别都替换为window2和navigator2。替换完成后就保存。此时再次在man.js中引入。就不会报错。引入如下
import JSEncrypt from 'jsencrypt';
//模拟公钥 一般是后端工程师提供
var publicKey =
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJpTYsMvGsDXKgqJX10cq4iFr9/HrzP6kygjmVt1bFf7zRf1pChdFPBo4ziQn83eAb";
// rsa加密
Vue.prototype.$getRsaCode = function(str) { // 注册方法
let pubKey = `-----BEGIN PUBLIC KEY-----${publicKey}-----END PUBLIC KEY-----`;
// ES6 模板字符串 引用 rsa 公钥
let encryptStr = new JSEncrypt();
encryptStr.setPublicKey(pubKey);
// 设置 加密公钥
let data = https://www.it610.com/article/encryptStr.encrypt(str.toString());
// 进行加密
return data;
}
至此,问题解决。 参考链接 【uniapp中使用rsa(jsencrypt)加密报错的问题】https://www.meiwen.com.cn/subject/rwyckqtx.html
另外,如果单独开发小程序的时候发生rsa报错,建议使用小程序npm模式,安装引入wx-rsa即可。
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 由浅入深理解AOP
- 异地恋中,逐渐适应一个人到底意味着什么()
- 【译】20个更有效地使用谷歌搜索的技巧
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售