一、jsencrypt.js 核心介绍
jsencrypt.js 是一个基于 JavaScript 实现的 RSA 非对称加密库,它简化了前端对 RSA 加密/解密、签名/验签的操作,无需依赖后端即可完成前端侧的 RSA 加解密处理。
1. 核心特点
- 基于开源项目
tomrus88/rsa-compat 封装,适配浏览器环境(也可兼容 Node.js); - 支持 RSA 密钥对生成、公钥加密、私钥解密、私钥签名、公钥验签;
- 支持 PKCS#1 v1.5 填充方式(RSA 最常用的填充方式,也是默认方式);
- 支持密钥格式:PKCS#1(
-----BEGIN RSA PRIVATE KEY-----)、PKCS#8(-----BEGIN PRIVATE KEY-----)、X.509 公钥(-----BEGIN PUBLIC KEY-----)。
2. 适用场景
- 前端敏感数据加密(如登录密码、手机号),避免明文传输;
- 前后端数据加解密交互(前端公钥加密,后端私钥解密);
- 前端签名、后端验签(防止数据被篡改)。
二、安装与引入
1. 安装方式
- CDN 引入(最便捷):
<script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.3.2/jsencrypt.min.js"></script>
- npm 安装(模块化项目):
npm install jsencrypt --save
安装后在项目中引入:
import JSEncrypt from 'jsencrypt';
const JSEncrypt = require('jsencrypt').default;
三、核心使用方法
1. 基础用法:公钥加密 + 私钥解密
这是最常用的场景,前端用后端下发的公钥加密敏感数据,后端用私钥解密。
const encrypt = new JSEncrypt();
const publicKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFENGw33yGihy92pDjZQhl0C3
6rPJj+CvfSC8+q28hxA161QFNUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6
Z4UMR7EOcpfdUE9Hf3m/hs+FUR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJw
oYi+1hqp1fIekaxsyQIDAQAB
-----END PUBLIC KEY-----`;
encrypt.setPublicKey(publicKey);
const plainText = '123456';
const cipherText = encrypt.encrypt(plainText);
console.log('加密结果:', cipherText);
const decrypt = new JSEncrypt();
const privateKey = `-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDCFENGw33yGihy92pDjZQhl0C36rPJj+CvfSC8+q28hxA161QF
NUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6Z4UMR7EOcpfdUE9Hf3m/hs+F
UR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJwoYi+1hqp1fIekaxsyQIDAQAB
AoGBAJR8ZkCUvx5kzv+utdl7T5MnordT1TvoXXJGXK7ZZ+UuvMNUCdN2QPc4sBiA
QWvLw1cSKt5DsKZ8UETpYPy8pPYnnDEz2dDYiaew9+xEpubyeW2oH4Zx71wqBtOK
kqwrXa/pzdpiucRRjk6vE6YY7EBBs/g7uanVpGibOVAEsqH1AkEA7DkjVH28WDUg
f1nqvfn2Kj6CT7nIcE3jGJsZZ7zlZmBmHFDONMLUrXR/Zm3pR5m0tCmBqa5RK95u
412jt1dPIwJBANJT3v8pnkth48bQo/fKel6uEYyboRtA5/uHuHkZ6FQF7OUkGogc
mSJluOdc5t6hI1VsLn0QZEjQZMEOWr+wKSMCQQCC4kXJEsHAve77oP6HtG/IiEn7
kpyUXRNvFsDE0czpJJBvL/aRFUJxuRK91jhjC68sA7NsKMGg5OXb5I5Jj36xAkEA
gIT7aFOYBFwGgQAQkWNKLvySgKbAZRTeLBacpHMuQdl1DfdntvAyqpAZ0lY0RKmW
G6aFKaqQfOXKCyWoUiVknQJAXrlgySFci/2ueKlIE1QqIiLSZ8V8OlpFLRnb1pzI
7U1yQXnTAEFYM560yJlzUpOb1V4cScGd365tiSMvxLOvTA==
-----END RSA PRIVATE KEY-----`;
decrypt.setPrivateKey(privateKey);
const decryptedText = decrypt.decrypt(cipherText);
console.log('解密结果:', decryptedText);
2. 进阶用法:生成 RSA 密钥对
jsencrypt.js 支持前端生成 RSA 密钥对(仅测试/临时使用,生产环境建议后端生成):
const encrypt = new JSEncrypt({ default_key_size: 1024 });
encrypt.getKey();
const publicKey = encrypt.getPublicKey();
const privateKey = encrypt.getPrivateKey();
console.log('生成的公钥:', publicKey);
console.log('生成的私钥:', privateKey);
3. 签名与验签
用于验证数据是否被篡改,私钥签名,公钥验签:
const encrypt = new JSEncrypt();
encrypt.setPrivateKey(privateKey);
const text = '需要签名的内容';
const signature = encrypt.sign(text, CryptoJS.SHA256, 'sha256');
encrypt.setPublicKey(publicKey);
const isValid = encrypt.verify(text, signature, CryptoJS.SHA256);
console.log('验签结果:', isValid);
注意:签名需要依赖 crypto-js 库,需额外引入:<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.2.0/crypto-js.min.js"></script>。
四、关键注意事项
- 密钥长度:建议使用 2048 位密钥(1024 位安全性较低),但 2048 位加密速度会稍慢;
- 加密内容长度限制:RSA 加密单段内容长度有限制(≈ 密钥长度/8 - 11),例如 1024 位密钥最多加密 117 字节,2048 位最多加密 245 字节。若加密长文本,需分段加密或结合对称加密(如 AES);
- 安全性:前端不要暴露私钥,公钥可公开;加密仅解决传输过程中的明文泄露,需配合 HTTPS 使用;
- 兼容性:兼容主流浏览器,IE 需版本 ≥ 10;Node.js 环境使用需额外安装
buffer 依赖; - 性能:前端 RSA 加解密性能较低,避免频繁调用,建议仅加密敏感小数据(如密码、token)。
五、常见问题
- 加密结果为 null:大概率是密钥格式错误(如缺少首尾标识行、空格/换行错误),或加密内容超过长度限制;
- 验签失败:哈希算法不匹配(如签名用 sha256,验签用 sha1),或数据被篡改,或密钥不匹配;
- 中文乱码:加密前将中文转
utf8 编码,解密后再转回。
总结
jsencrypt.js 是前端实现 RSA 非对称加密的轻量库,核心用于公钥加密、私钥解密、签名验签;- 核心用法是初始化实例 → 设置密钥 → 执行加解密/签名验签,需注意密钥格式和内容长度限制;
- 生产环境中,前端仅用公钥加密敏感数据,私钥解密/验签由后端完成,且需配合 HTTPS 保障安全。