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]; }
没有帐号? 现在注册.