jsencrypt 加密后端解不开,是哪里出问题了?
我用 jsencrypt 在前端加密手机号,传给 Java 后端,但后端一直报解密失败。我确认公钥是从后端拿的,格式也没动过,不知道是不是加密方式不对?
这是我的前端代码:
<script src="https://cdn.jsdelivr.net/npm/jsencrypt@3.0.0/bin/jsencrypt.min.js"></script>
<script>
const encrypt = new JSEncrypt();
encrypt.setPublicKey(-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
-----END PUBLIC KEY-----);
const encrypted = encrypt.encrypt('13800138000');
console.log(encrypted); // 传给后端
</script>
后端用的是标准 RSA/ECB/PKCS1Padding,难道 jsencrypt 默认不是 PKCS#1 v1.5?
首先确认公钥传递过程没问题,最好在前端加密前打印一下拿到的公钥内容,确保和后端生成的一模一样。有时候格式不对或者中间多了换行、空格都会导致加密结果异常。
另外要注意安全,不要直接在页面上写明文公钥,建议通过接口动态获取。虽然公钥本身不敏感,但暴露太多信息总是不好。
后端这边也检查一下是不是真的用了正确的私钥来解密。要是私钥错了或者被篡改过,肯定会解不开的。
最后提醒一下,手机号这种敏感信息建议使用 HTTPS 传输,即使加密了也要注意中间人攻击风险。
如果还是不行的话,可以试试用 openssl 命令行工具模拟一下加解密流程,排查到底是哪边的问题:
这个命令可以用你的公钥文件测试下加密结果是否一致。希望这些能帮到你。