前端用公钥加密数据后端却解密失败,是哪里出错了?
我在前端用 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,前端默认也是这个吗?
先说前端部分,你得确保加密结果是标准的Base64编码。试试这个方法,在发送给后端前明确指定编码方式:
后端解密时要注意几个坑:
- Java端要用同样的字符集(通常是UTF-8)来处理Base64解码
- RSA解密时要检查公钥/私钥是否匹配
- 解密时的填充模式必须一致
如果还不行,建议在Java端打印异常堆栈信息,通常能发现具体问题。我以前遇到过类似情况,最后发现是字符集不一致导致的,真是折腾了好久。
另外提醒下,直接用RSA加密密码也不是最佳实践,考虑加个对称加密层会更安全些。