解决微信小程序开发中jsencrypt加解密遇到的问题

202 阅读1分钟

最近开发过程中遇到一个问题,就是在h5的电脑端和手机端使用jsencrypt进行加解密数据,没有任何问题,而在编译成小程序的时候就会报错(我是使用的uni-app开发)

image.png

这个错误的原因就在于jsencrypt代码中里面含有window、document、navigator等对象,而这些对象在小程序中并没有,所以当代码执行到相应的位置就就报错了。导致微信小程序的项目跑不起来。

我们可以尝试着修改一下源代码,将微信小程序中用不到的对象注释或者修改即可,下面是我修改的部分

image.png

/***************************************修改******************************************/
// 修改前:

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

// 修改后:

// 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;
// }
/************************************************************************************/
/*****************************************修改*******************************************/
// 修改前
    // 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;
    //     }
    // }
// 修改后
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);
  
  // Use mouse events for entropy, if we do not have enough entropy by the time
  // we need it, entropy will be generated by Math.random.
  var onMouseMoveListener_1 = function (ev) {
      this.count = this.count || 0;
      if (this.count >= 256 || rng_pptr >= rng_psize) {
        // 注释:
          // if (window.removeEventListener) {
              //     window.removeEventListener("mousemove", onMouseMoveListener_1, false);
              // }
              // else if (window.detachEvent) {
                  //     window.detachEvent("onmousemove", onMouseMoveListener_1);
                  // }
                  return;
                }
                try {
                    var mouseCoordinates = ev.x + ev.y;
                    rng_pool[rng_pptr++] = mouseCoordinates & 255;
                    this.count += 1;
                }
                catch (e) {
                    // Sometimes Firefox will deny permission to access event properties for some reason. Ignore.
                }
            };
            // 注释:
            // if (window.addEventListener) {
                //     window.addEventListener("mousemove", onMouseMoveListener_1, false);
                // }
                // else if (window.attachEvent) {
                    //     window.attachEvent("onmousemove", onMouseMoveListener_1);
                    // }
                }
/****************************************************************************************/