前端用 RSA 加密登录密码,为什么后端解密失败?
我在 React 项目里用 jsencrypt 做登录密码的 RSA 加密,本地测试加密看起来没问题,但传给 Java 后端后一直报“解密失败”或“BadPaddingException”。是不是公钥格式或者加密方式哪里不对?
我用的公钥是后端给的 PEM 格式,直接复制进来的。代码大概这样:
import JSEncrypt from 'jsencrypt';
const encryptPassword = (password) => {
const publicKey = <code>-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC...
-----END PUBLIC KEY-----</code>;
const encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
return encrypt.encrypt(password);
};
试过把换行符替换成 n,也试过 base64 编码后再传,但后端还是解不开,到底卡在哪了?
首先确保公钥在前后端一致,PEM格式的公钥前后端都要能识别。你提到的换行符替换是个好思路,不过要小心处理。
在前端,确保公钥字符串里的换行符都去掉,中间的空格也要去掉,然后试试看:
注意,上面的
publicKey字符串已经去掉了换行符和空格。然后在后端,确保你用的是对应的私钥来解密,并且解密的时候也要注意编码问题,通常是 Base64 编码。
Java 后端解密的代码示例(假设你用的是 BouncyCastle 库):
确保你的私钥也是正确的 Base64 编码格式。
如果还是有问题,检查一下加密算法是否一致,前后端都应该用
RSA/ECB/PKCS1Padding或类似的填充方式。