GitHub 上使用 JavaScript 來(lái)生成公鑰私鑰對(duì)的庫(kù):https://github.com/travist/jsencrypt/
修改庫(kù)
但是在微信小程序中傲隶,引入這個(gè)庫(kù)會(huì)報(bào)這樣的錯(cuò)誤error.png
原因是這個(gè)第三方庫(kù)使用了 window 對(duì)象,而微信小程序的頁(yè)面的腳本邏輯是在 JsCore 中運(yùn)行,JsCore 是一個(gè)沒(méi)有窗口對(duì)象的環(huán)境垫卤,所以不能在腳本中使用 window傲诵,也無(wú)法在腳本中操作組件项滑。
經(jīng)過(guò)了一段時(shí)間的掙扎卷扮,終于找到了解決方法:
- 給第三方庫(kù)添加 window2 和 navigator2 變量
- 將程序中用到 window 和 navigator 的地方進(jìn)行全局替換 為window2 和 navigator2寿冕。
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.JSEncrypt = {})));
}(this, (function (exports) { 'use strict';
//--------------------- 這里開(kāi)始添加---------------------
// 用來(lái)替換 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'
};
// 用來(lái)替換window
var window2 = {
ASN1: null,
Base64: null,
Hex: null,
crypto: null,
href: null
};
//--------------------- 這里結(jié)束添加---------------------
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
function int2char(n) {
return BI_RM.charAt(n);
}
生成公鑰私鑰
// 引入文件
var Encrypt = require('jsencrypt.js')
// 生成秘鑰對(duì)
// 返回?cái)?shù)組 array[0]公鑰 array[1]私鑰
function generateKeys(){
var crypt = new Encrypt.JSEncrypt({ default_key_size: 1024 });
crypt.getKey();
var publicKey = crypt.getPublicKey();
var privateKey = crypt.getPrivateKey();
// 去除-----*** 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, "");
// 返回生成的秘鑰對(duì)
return [publicKey, privateKey];
}