小程序使用jsencrypt加密

本文介绍如何解决JSencrypt在小程序上不兼容的问题,通过修改源码使其支持小程序环境,并提供具体代码示例,包括如何引入和使用JSencrypt进行密码加密。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于项目需要,用到jsencrypt加密密码,于是就开工。中间百度了一下,但是最终都只是告诉我,不兼容,然后需要修改修改哪里。嗯,这个我跟着改了,那然后呢?????没有文章告诉我怎么继续然后。so,我自己摸索吧。反正我也做了,分享一下,对那些需要用jsencrypt对称加密的小伙伴一个帮助,一看就会。

 

1.由于小程序不支持window对象,所以,需要修改源码。将下载好的jsencrypt.js的打开(不是压缩包),进入页面,找到下面的位置,(这里“开始添加”是要加的内容,这里“结束添加”是添加结束),

将该添加的内容添加完后,用window2全局替换window,用navigator2全局替换navigator,注意:全局替换!!!!

(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';
    //------- 这里开始添加---------
    // 用来替换 navigator2
    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'
    };
    //  用来替换window2
    var window2 = {
        ASN1: null,
        Base64: null,
        Hex: null,
        crypto: null,
        href: null
    };
    //--------- 这里结束添加--------
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
function int2char(n) {
    return BI_RM.charAt(n);
}

添加完之后小程序就可以识别这个插件了。下面就可以进行调用了。看看我放js的位置

在需要调用的地方先引入jsencrypt.js(类似这样引入,我截图错了懒得改了,你们参照着来就行哈)

引入之后,可以进行使用,具体代码如下:

const Encrypt  = require('../../../utils/jsencrypt.js');//路径看个人的放哪里哈
let cryptFirst = new Encrypt.JSEncrypt();
cryptFirst.setPublicKey(util.rsa_public_key);//rsa_public_key是你获取到的公钥,公钥请去掉----begin和---end

Page({

    /**页面的初始数据*/
    data: {
        pwd_en: null, //得到密码
    },
    /** 登录*/
    tapLogin() {
        this.login({"pwd_en": cryptFirst.encrypt(this.data.passWord)});        
    },

})

记得,公钥一定要去掉-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----

还有记得把密钥先合成一行,然后写好引号再把密钥放进去,不然小程序会在密钥的“/”和“+”这些符号旁边加上空格

以上就完成了jsencrypt加密。

最后,知道有部分人懒得自己去压缩js,所以我也把我压缩之后的文件放上来吧。

(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'; 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' }; var window2 = { ASN1: null, Base64: null, Hex: null, crypto: null, href: null }; var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"; function int2char(n) { return BI_RM.charAt(n) } function op_and(x, y) { return x & y } function op_or(x, y) { return x | y } function op_xor(x, y) { return x ^ y } function op_andnot(x, y) { return x & ~y } function lbit(x) { if (x == 0) { return -1 } var r = 0; if ((x & 0xffff) == 0) { x >>= 16; r += 16 } if ((x & 0xff) == 0) { x >>= 8; r += 8 } if ((x & 0xf) == 0) { x >>= 4; r += 4 } if ((x & 3) == 0) { x >>= 2; r += 2 } if ((x & 1) == 0) { ++r } return r } function cbit(x) { var r = 0; while (x != 0) { x &= x - 1; ++r } return r } var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var b64pad = "="; function hex2b64(h) { var i; var c; var ret = ""; for (i = 0; i + 3 <= h.length; i += 3) { c = parseInt(h.substring(i, i + 3), 16); ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63) } if (i + 1 == h.length) { c = parseInt(h.substring(i, i + 1), 16); ret += b64map.charAt(c << 2) } else if (i + 2 == h.length) { c = parseInt(h.substring(i, i + 2), 16); ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4) } while ((ret.length & 3) > 0) { ret += b64pad } return ret } function b64tohex(s) { var ret = ""; var i; var k = 0; var slop = 0; for (i = 0; i < s.length; ++i) { if (s.charAt(i) == b64pad) { break } var v = b64map.indexOf(s.charAt(i)); if (v < 0) { continue } if (k == 0) { ret += int2char(v >> 2); slop = v & 3; k = 1 } else if (k == 1) { ret += int2char((slop << 2) | (v >> 4)); slop = v & 0xf; k = 2 } else if (k == 2) { ret += int2char(slop); ret += int2char(v >> 2); slop = v & 3; k = 3 } else { ret += int2char((slop << 2) | (v >> 4)); ret += int2char(v & 0xf); k = 0 } } if (k == 1) { ret += int2char(slop << 2) } return ret } var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p] }; return extendStatics(d, b) }; function __extends(d, b) { extendStatics(d, b); function __() { this.constructor = d } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()) } var decoder; var Hex = { decode: function (a) { var i; if (decoder === undefined) { var hex = "0123456789ABCDEF"; var ignore = " \f\n\r\t\u00A0\u2028\u2029"; decoder = {}; for (i = 0; i < 16; ++i) { decoder[hex.charAt(i)] = i } hex = hex.toLowerCase(); for (i = 10; i < 16; ++i) { decoder[hex.charAt(i)] = i } for (i = 0; i < ignore.length; ++i) { decoder[ignore.charAt(i)] = -1 } } var out = []; var bits = 0; var char_count = 0; for (i = 0; i < a.length; ++i) { var c = a.charAt(i); if (c == "=") { break } c = decoder[c]; if (c == -1) { continue } if (c === undefined) { throw new Error("Illegal character at offset " + i); } bits |= c; if (++char_count >= 2) { out[out.length] = bits; bits = 0; char_count = 0 } else { bits <<= 4 } } if (char_count) { throw new Error("Hex encoding incomplete: 4 bits missing"); } return out } }; var decoder$1; var Base64 = { decode: function (a) { var i; if (decoder$1 === undefined) { var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var ignore = "= \f\n\r\t\u00A0\u2028\u2029"; decoder$1 = Object.create(null); for (i = 0; i < 64; ++i) { decoder$1[b64.charAt(i)] = i } for (i = 0; i < ignore.length; ++i) { decoder$1[ignore.charAt(i)] = -1 } } var out = []; var bits = 0; var char_count = 0; for (i = 0; i < a.length; ++i) { var c = a.charAt(i); if (c == "=") { break } c = decoder$1[c]; if (c == -1) { continue } if (c === undefined) { throw new Error("Illegal character at offset " + i); } bits |= c; if (++char_count >= 4) { out[out.length] = (bits >> 16); out[out.length] = (bits >> 8) & 0xFF; out[out.length] = bits & 0xFF; bits = 0; char_count = 0 } else { bits <<= 6 } } switch (char_count) { case 1: throw new Error("Base64 encoding incomplete: at least 2 bits missing"); case 2: out[out.length] = (bits >> 10); break; case 3: out[out.length] = (bits >> 16); out[out.length] = (bits >> 8) & 0xFF; break }return out }, re: /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/, unarmor: function (a) { var m = Base64.re.exec(a); if (m) { if (m[1]) { a = m[1] } else if (m[2]) { a = m[2] } else { throw new Error("RegExp out of sync"); } } return Base64.decode(a) } }; var max = 10000000000000; var Int10 = (function () { function Int10(value) { this.buf = [+value || 0] } Int10.prototype.mulAdd = function (m, c) { var b = this.buf; var l = b.length; var i; var t; for (i = 0; i < l; ++i) { t = b[i] * m + c; if (t < max) { c = 0 } else { c = 0 | (t / max); t -= c * max } b[i] = t } if (c > 0) { b[i] = c } }; Int10.prototype.sub = function (c) { var b = this.buf; var l = b.length; var i; var t; for (i = 0; i < l; ++i) { t = b[i] - c; if (t < 0) { t += max; c = 1 } else { c = 0 } b[i] = t } while (b[b.length - 1] === 0) { b.pop() } }; Int10.prototype.toString = function (base) { if ((base || 10) != 10) { throw new Error("only base 10 is supported"); } var b = this.buf; var s = b[b.length - 1].toString(); for (var i = b.length - 2; i >= 0; --i) { s += (max + b[i]).toString().substring(1) } return s }; Int10.prototype.valueOf = function () { var b = this.buf; var v = 0; for (var i = b.length - 1; i >= 0; --i) { v = v * max + b[i] } return v }; Int10.prototype.simplify = function () { var b = this.buf; return (b.length == 1) ? b[0] : this }; return Int10 }()); var ellipsis = "\u2026"; var reTimeS = /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/; var reTimeL = /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/; function stringCut(str, len) { if (str.length > len) { str = str.substring(0, len) + ellipsis } return str } var Stream = (function () { function Stream(enc, pos) { this.hexDigits = "0123456789ABCDEF"; if (enc instanceof Stream) { this.enc = enc.enc; this.pos = enc.pos } else { this.enc = enc; this.pos = pos } } Stream.prototype.get = function (pos) { if (pos === undefined) { pos = this.pos++ } if (pos >= this.enc.length) { throw new Error("Requesting byte offset " + pos + " on a stream of length " + this.enc.length); } return ("string" === typeof this.enc) ? this.enc.charCodeAt(pos) : this.enc[pos] }; Stream.prototype.hexByte = function (b) { return this.hexDigits.charAt((b >> 4) & 0xF) + this.hexDigits.charAt(b & 0xF) }; Stream.prototype.hexDump = function (start, end, raw) { var s = ""; for (var i = start; i < end; ++i) { s += this.hexByte(this.get(i)); if (raw !== true) { switch (i & 0xF) { case 0x7: s += "  "; break; case 0xF: s += "\n"; break; default: s += " " } } } return s }; Stream.prototype.isASCII = function (start, end) { for (var i = start; i < end; ++i) { var c = this.get(i); if (c < 32 || c > 176) { return false } } return true }; Stream.prototype.parseStringISO = function (start, end) { var s = ""; for (var i = start; i < end; ++i) { s += String.fromCharCode(this.get(i)) } return s }; Stream.prototype.parseStringUTF = function (start, end) { var s = ""; for (var i = start; i < end;) { var c = this.get(i++); if (c < 128) { s += String.fromCharCode(c) } else if ((c > 191) && (c < 224)) { s += String.fromCharCode(((c & 0x1F) << 6) | (this.get(i++) & 0x3F)) } else { s += String.fromCharCode(((c & 0x0F) << 12) | ((this.get(i++) & 0x3F) << 6) | (this.get(i++) & 0x3F)) } } return s }; Stream.prototype.parseStringBMP = function (start, end) { var str = ""; var hi; var lo; for (var i = start; i < end;) { hi = this.get(i++); lo = this.get(i++); str += String.fromCharCode((hi << 8) | lo) } return str }; Stream.prototype.parseTime = function (start, end, shortYear) { var s = this.parseStringISO(start, end); var m = (shortYear ? reTimeS : reTimeL).exec(s); if (!m) { return "Unrecognized time: " + s } if (shortYear) { m[1] = +m[1]; m[1] += (+m[1] < 70) ? 2000 : 1900 } s = m[1] + "-" + m[2] + "-" + m[3] + " " + m[4]; if (m[5]) { s += ":" + m[5]; if (m[6]) { s += ":" + m[6]; if (m[7]) { s += "." + m[7] } } } if (m[8]) { s += " UTC"; if (m[8] != "Z") { s += m[8]; if (m[9]) { s += ":" + m[9] } } } return s }; Stream.prototype.parseInteger = function (start, end) { var v = this.get(start); var neg = (v > 127); var pad = neg ? 255 : 0; var len; var s = ""; while (v == pad && ++start < end) { v = this.get(start) } len = end - start; if (len === 0) { return neg ? -1 : 0 } if (len > 4) { s = v; len <<= 3; while (((+s ^ pad) & 0x80) == 0) { s = +s << 1; --len } s = "(" + len + " bit)\n" } if (neg) { v = v - 256 } var n = new Int10(v); for (var i = start + 1; i < end; ++i) { n.mulAdd(256, this.get(i)) } return s + n.toString() }; Stream.prototype.parseBitString = function (start, end, maxLength) { var unusedBit = this.get(start); var lenBit = ((end - start - 1) << 3) - unusedBit; var intro = "(" + lenBit + " bit)\n"; var s = ""; for (var i = start + 1; i < end; ++i) { var b = this.get(i); var skip = (i == end - 1) ? unusedBit : 0; for (var j = 7; j >= skip; --j) { s += (b >> j) & 1 ? "1" : "0" } if (s.length > maxLength) { return intro + stringCut(s, maxLength) } } return intro + s }; Stream.prototype.parseOctetString = function (start, end, maxLength) { if (this.isASCII(start, end)) { return stringCut(this.parseStringISO(start, end), maxLength) } var len = end - start; var s = "(" + len + " byte)\n"; maxLength /= 2; if (len > maxLength) { end = start + maxLength } for (var i = start; i < end; ++i) { s += this.hexByte(this.get(i)) } if (len > maxLength) { s += ellipsis } return s }; Stream.prototype.parseOID = function (start, end, maxLength) { var s = ""; var n = new Int10(); var bits = 0; for (var i = start; i < end; ++i) { var v = this.get(i); n.mulAdd(128, v & 0x7F); bits += 7; if (!(v & 0x80)) { if (s === "") { n = n.simplify(); if (n instanceof Int10) { n.sub(80); s = "2." + n.toString() } else { var m = n < 80 ? n < 40 ? 0 : 1 : 2; s = m + "." + (n - m * 40) } } else { s += "." + n.toString() } if (s.length > maxLength) { return stringCut(s, maxLength) } n = new Int10(); bits = 0 } } if (bits > 0) { s += ".incomplete" } return s }; return Stream }()); var ASN1 = (function () { function ASN1(stream, header, length, tag, sub) { if (!(tag instanceof ASN1Tag)) { throw new Error("Invalid tag value."); } this.stream = stream; this.header = header; this.length = length; this.tag = tag; this.sub = sub } ASN1.prototype.typeName = function () { switch (this.tag.tagClass) { case 0: switch (this.tag.tagNumber) { case 0x00: return "EOC"; case 0x01: return "BOOLEAN"; case 0x02: return "INTEGER"; case 0x03: return "BIT_STRING"; case 0x04: return "OCTET_STRING"; case 0x05: return "NULL"; case 0x06: return "OBJECT_IDENTIFIER"; case 0x07: return "ObjectDescriptor"; case 0x08: return "EXTERNAL"; case 0x09: return "REAL"; case 0x0A: return "ENUMERATED"; case 0x0B: return "EMBEDDED_PDV"; case 0x0C: return "UTF8String"; case 0x10: return "SEQUENCE"; case 0x11: return "SET"; case 0x12: return "NumericString"; case 0x13: return "PrintableString"; case 0x14: return "TeletexString"; case 0x15: return "VideotexString"; case 0x16: return "IA5String"; case 0x17: return "UTCTime"; case 0x18: return "GeneralizedTime"; case 0x19: return "GraphicString"; case 0x1A: return "VisibleString"; case 0x1B: return "GeneralString"; case 0x1C: return "UniversalString"; case 0x1E: return "BMPString" }return "Universal_" + this.tag.tagNumber.toString(); case 1: return "Application_" + this.tag.tagNumber.toString(); case 2: return "[" + this.tag.tagNumber.toString() + "]"; case 3: return "Private_" + this.tag.tagNumber.toString() } }; ASN1.prototype.content = function (maxLength) { if (this.tag === undefined) { return null } if (maxLength === undefined) { maxLength = Infinity } var content = this.posContent(); var len = Math.abs(this.length); if (!this.tag.isUniversal()) { if (this.sub !== null) { return "(" + this.sub.length + " elem)" } return this.stream.parseOctetString(content, content + len, maxLength) } switch (this.tag.tagNumber) { case 0x01: return (this.stream.get(content) === 0) ? "false" : "true"; case 0x02: return this.stream.parseInteger(content, content + len); case 0x03: return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseBitString(content, content + len, maxLength); case 0x04: return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(content, content + len, maxLength); case 0x06: return this.stream.parseOID(content, content + len, maxLength); case 0x10: case 0x11: if (this.sub !== null) { return "(" + this.sub.length + " elem)" } else { return "(no elem)" } case 0x0C: return stringCut(this.stream.parseStringUTF(content, content + len), maxLength); case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x1A: return stringCut(this.stream.parseStringISO(content, content + len), maxLength); case 0x1E: return stringCut(this.stream.parseStringBMP(content, content + len), maxLength); case 0x17: case 0x18: return this.stream.parseTime(content, content + len, (this.tag.tagNumber == 0x17)) }return null }; ASN1.prototype.toString = function () { return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + ((this.sub === null) ? "null" : this.sub.length) + "]" }; ASN1.prototype.toPrettyString = function (indent) { if (indent === undefined) { indent = "" } var s = indent + this.typeName() + " @" + this.stream.pos; if (this.length >= 0) { s += "+" } s += this.length; if (this.tag.tagConstructed) { s += " (constructed)" } else if ((this.tag.isUniversal() && ((this.tag.tagNumber == 0x03) || (this.tag.tagNumber == 0x04))) && (this.sub !== null)) { s += " (encapsulates)" } s += "\n"; if (this.sub !== null) { indent += "  "; for (var i = 0, max = this.sub.length; i < max; ++i) { s += this.sub[i].toPrettyString(indent) } } return s }; ASN1.prototype.posStart =
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值