// 跨端密码加密工具(H5 / 小程序 / App 均可用) // 说明:原 jsencrypt 依赖浏览器 window.crypto,小程序/App 无 DOM 会失败; // wxmp-rsa 是 jsencrypt 同源 fork(jsbn 纯 JS 实现,随机数走 Math.random 兜底), // 无任何浏览器全局依赖,API 与 jsencrypt 完全一致,一套代码全端运行。 import CryptoJS from "crypto-js"; import { JSEncrypt } from "wxmp-rsa"; /** MD5 摘要(小写 hex),与旧系统 WebVue 的 CryptoJS.MD5(...).toString() 输出一致 */ export function md5Hex(text: string): string { return CryptoJS.MD5(text).toString(); } /** * RSA 公钥加密(PKCS#1 v1.5),返回 base64 密文 * @param plaintext 待加密明文 * @param publicKeyPem 后端 /Auth/GetRsaPublicKey 返回的 PEM 公钥(无换行的裸格式也可) * @returns 加密失败返回空串,调用方需判空兜底 */ export function rsaEncrypt(plaintext: string, publicKeyPem: string): string { const encryptor = new JSEncrypt(); encryptor.setPublicKey(publicKeyPem); // encrypt 失败返回 false(非 nullish),用 || 兜底为空串 return encryptor.encrypt(plaintext) || ""; } /** * 登录密码密文:RSA( Guid + MD5(密码) ),算法与旧系统 WebVue 登录完全一致 * Guid 同时作为请求体 LoginData.Guid 发送,服务端解密后比对前缀防重放 */ export function encryptLoginPassword( password: string, guid: string, publicKeyPem: string, ): string { return rsaEncrypt(guid + md5Hex(password), publicKeyPem); }