外观
JSEncrypt RSA 加密
2026-04-01
版本: 3.3.2 官网: travistidwell.com/jsencrypt
JSEncrypt 是前端 RSA 加密库,在 Nebula 中用于登录时对用户密码加密后再传输,避免密码明文在网络中传输。
整体流程:
前端获取 RSA 公钥 → 用公钥加密明文密码 → 将密文发送给后端 → 后端用私钥解密安装
pnpm add jsencrypt登录场景完整用法
这是 Nebula 主应用登录页(nebula-web-main)的完整实现,是项目中 JSEncrypt 的唯一使用场景:
import JSEncrypt from 'jsencrypt'
import { ref, onMounted } from 'vue'
const publicKey = ref('')
/** 页面加载时从后端拉取 RSA 公钥 */
onMounted(async () => {
await loadPublicKey()
})
async function loadPublicKey() {
try {
const res = await getPublicKey() // 调用 /auth/rsa/public-key 接口
publicKey.value = res.publicKey
} catch {
// 公钥加载失败时,密码将以明文传输(仅开发调试时可接受)
console.warn('[Login] RSA 公钥加载失败,密码将以明文传输')
}
}
/** RSA 加密密码 */
function encryptPassword(pwd: string): string {
if (!publicKey.value) return pwd // 没有公钥时降级为明文
const encrypt = new JSEncrypt()
encrypt.setPublicKey(publicKey.value)
const encrypted = encrypt.encrypt(pwd)
return encrypted || pwd // encrypt 失败时返回原文
}
/** 提交登录 */
async function onLogin() {
await loginApi({
username: form.value.username,
password: encryptPassword(form.value.password), // 加密后传输
captchaId: captchaId.value,
captchaCode: form.value.captchaCode,
loginDevice: 'web',
})
}API 说明
import JSEncrypt from 'jsencrypt'
const encrypt = new JSEncrypt()
// 设置公钥(PEM 格式,带或不带 -----BEGIN PUBLIC KEY----- 头都支持)
encrypt.setPublicKey(publicKeyString)
// 用公钥加密(返回 Base64 字符串,失败返回 false)
const cipherText: string | false = encrypt.encrypt('明文内容')
// 设置私钥(通常只在后端使用,前端不持有私钥)
encrypt.setPrivateKey(privateKeyString)
// 用私钥解密
const plainText: string | false = encrypt.decrypt(cipherText)注意事项
RSA 加密的限制
RSA 公钥加密有明文长度限制(通常 2048 位密钥最多加密 245 字节),适合加密短文本(如密码)。
不适合加密大文件或长文本,大数据加密应使用对称加密(AES)+ RSA 加密密钥的混合方案。
公钥格式
后端返回的公钥是 Base64 编码的 DER 格式字符串,JSEncrypt 可直接使用,无需手动拼接 -----BEGIN PUBLIC KEY----- 头尾。
| 场景 | 推荐方案 |
|---|---|
| 登录密码加密 | JSEncrypt(RSA,当前方案) |
| 敏感配置项加密 | 后端 Jasypt,前端无需处理 |
| 数据传输完整性校验 | HTTPS + 接口签名(非 JSEncrypt 职责) |
