GitHub 上使用 JavaScript 来生成公钥私钥对的库:https://github.com/travist/jsencrypt/
修改库
但是在微信小程序中,引入这个库会报这样的错误原因是这个第三方库使用了 window 对象,而微信小程序的页面的脚本逻辑是在 JsCore 中运行,JsCore 是一个没有窗口对象的环境,所以不能在脚本中使用 window,也无法在脚本中操作组件。
经过了一段时间的挣扎,终于找到了解决方法:
- 给第三方库添加 window2 和 navigator2 变量
- 将程序中用到 window 和 navigator 的地方进行全局替换 为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';
//--------------------- 这里开始添加---------------------
// 用来替换 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
};
//--------------------- 这里结束添加---------------------
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
function int2char(n) {
return BI_RM.charAt(n);
}
生成公钥私钥
// 引入文件
var Encrypt = require('jsencrypt.js')
// 生成秘钥对
// 返回数组 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, "");
// 返回生成的秘钥对
return [publicKey, privateKey];
}