JavaScript数据加密需选对场景、算法并避误区:Base64非加密,哈希须加盐且用SHA-256+,AES密钥须动态下发,RSA宜加密短数据或AES密钥,Web Crypto API为现代首选;前端加密不能替代HTTPS和后端防护。

JavaScript中做数据加密,核心是选对场景、用对算法、避开常见误区。前端加密不能替代HTTPS和后端防护,但能加一层传输或存储保护。下面从常用方式和推荐库两方面说清楚。
常见的加密方式及适用场景
不同需求对应不同技术,混用或误用反而带来假安全感:
-
Base64编码:不是加密,只是二进制转文本的编码方式。适合图片转data URL、简单参数混淆,绝不能用于密码或敏感字段。浏览器里直接用
btoa()和atob()即可,无需引入库。 - 哈希(SHA-256等):单向不可逆,适合密码摘要、接口签名、数据校验。注意必须加盐(salt),且盐值不能写死在前端。MD5/SHA-1 已不安全,应只用 SHA-256 或更高。
- AES对称加密:加密解密用同一密钥,速度快、强度高,适合加密用户输入的敏感内容(如临时token、配置项)。密钥管理是关键——硬编码在JS里等于公开,建议由后端动态下发,或结合用户登录态生成。
- RSA非对称加密:前端用公钥加密,后端用私钥解密。适合传输一次性密钥或登录密码。注意RSA有长度限制(比如2048位公钥最多加密约245字节),一般不直接加密长数据,而是加密AES密钥。
- Web Crypto API:浏览器原生支持,无需第三方库,涵盖AES、RSA、SHA、HMAC等全套能力,还支持密钥生成、导出控制(如不可提取私钥)。兼容性已覆盖Chrome 37+、Firefox 34+、Edge 11+、Safari 16.4+,现代项目首选。
主流加密库对比与推荐
根据目标环境和维护状态,推荐这几类:
- CryptoJS:老牌轻量库,API简洁,支持AES、SHA、MD5等。适合快速原型或需兼容老旧浏览器的项目。缺点是不支持密钥安全存储,所有密钥都在内存中明文存在。
- JSEncrypt:专注RSA的轻量库,上手快,常配合公钥加密密码。注意它不处理密钥生成,公钥需后端提供,私钥绝不出现于前端。
-
Web Crypto API(原生):现代标准,性能好、安全性高,支持密钥隔离(如
extractable: false防止私钥被导出)。推荐新项目优先使用,配合crypto.subtle.generateKey、encrypt、digest等方法实现端到端可控流程。 -
bcryptjs:仅用于哈希场景,提供加盐和多轮迭代(如
bcrypt.hashSync(pwd, salt)),比裸SHA更抗暴力破解。适合前端做密码预处理(仍需HTTPS+服务端二次哈希)。
实际开发中的关键提醒
再强的加密,用错地方就白搭:
立即学习“Java免费学习笔记(深入)”;
- 登录密码不要只在前端哈希——攻击者绕过JS直接发请求,哈希毫无意义。应配合HTTPS + 后端加盐慢哈希(如bcrypt/PBKDF2)。
- 避免在代码里写死密钥或公钥字符串。公钥可通过接口安全获取;对称密钥可由后端生成并用RSA加密后传给前端。
- IV(初始化向量)必须每次随机生成,且随密文一起传输,不能复用。AES-GCM模式还能自带认证,比CBC更推荐。
- 加密不是万能的。前端逻辑始终可被调试、Hook、重放。真正敏感操作(如支付、权限变更)必须由后端鉴权并执行。










