前端用公钥加密数据后端却解密失败,是哪里出错了?

欣怡 Dev 阅读 4

我在前端用 JSEncrypt 用后端给的 RSA 公钥加密用户密码,但后端(Java)一直报解密失败。我确认公钥格式没问题,也试过 Base64 编码,但还是不行。

这是我在 HTML 里引入并调用加密的代码:

<script src="jsencrypt.min.js"></script>
<script>
  const encrypt = new JSEncrypt();
  encrypt.setPublicKey(-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
-----END PUBLIC KEY-----);
  const encrypted = encrypt.encrypt('123456');
  console.log(encrypted); // 发送给后端
</script>

是不是加密方式或填充模式不匹配?后端用的是 PKCS#1 v1.5,前端默认也是这个吗?

我来解答 赞 0 收藏
二维码
手机扫码查看
1 条解答
设计师广利
问题很可能出在编码和填充模式上。JSEncrypt默认确实用的是PKCS#1 v1.5,但Java端的实现可能有差异。

先说前端部分,你得确保加密结果是标准的Base64编码。试试这个方法,在发送给后端前明确指定编码方式:


const encrypted = encrypt.encrypt('123456');
const encoded = btoa(encrypted); // 确保是标准Base64
console.log(encoded);


后端解密时要注意几个坑:
- Java端要用同样的字符集(通常是UTF-8)来处理Base64解码
- RSA解密时要检查公钥/私钥是否匹配
- 解密时的填充模式必须一致

如果还不行,建议在Java端打印异常堆栈信息,通常能发现具体问题。我以前遇到过类似情况,最后发现是字符集不一致导致的,真是折腾了好久。

另外提醒下,直接用RSA加密密码也不是最佳实践,考虑加个对称加密层会更安全些。
点赞
2026-03-30 17:03