问题描述
由于jsEncrypt.js代码里面含有window、document、navigator对象,这些对象可以在pc端的浏览器使用,但是小程序没有这些对象,所以直接在小程序引入jsEncrypt.js会直接报错,下面主要介绍如何在jsEncrypt.js里面对这些对象进行兼容。

https://developers.weixin.qq.com/community/develop/doc/000068b497cfc00619b7bcfdc51004
下载jsencrypt.js
jsEncrypt.js介绍
功能
一种RSA加密的解决方案。 这种加密模式被称为"非对称加密算法"。

(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。

(2)甲方获取乙方的公钥,然后用它对信息加密。

(3)乙方得到加密后的信息,用私钥解密。

如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。

使用场景
加密验证码。
开始兼容处理
源代码
在线预览:源代码地址

1)兼容window.crypto
源代码第2754行

if (window.crypto && window.crypto.getRandomValues) {    // 生成长度为256,元素值为0的数组
    var z = new Uint32Array(256);    // 生成长度为256,元素随机值的数组
    window.crypto.getRandomValues(z);
}

兼容代码

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);

兼容window.removeEventListener、window.detachEvent
源代码

if (window.removeEventListener) {   

  window.removeEventListener("mousemove", onMouseMoveListener_1, false);

} else if (window.detachEvent) {    

  window.detachEvent("onmousemove", onMouseMoveListener_1);

}

2)兼容处理:
直接删掉,监听的事件不会影响到加密和解密
3)兼容navigator.appName、navigator.userAgent
源代码

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;
}

兼容处理:
直接删掉。navigator主要是对浏览器的判断
最后
去一个在线压缩js的网站压缩一下代码,然后在小程序里引入就搞定啦。
总结
兼容处理其实比较简单粗暴,第三方库在小程序的兼容处理其实很简单。

标签: none

添加新评论