Vue中用jsencrypt加密RSA后结果与服务端不一致怎么办?
我在做一个登录接口需要RSA加密密码字段,用jsencrypt库加密后的字符串和后端给的示例完全不一样。按照文档把公钥写成字符串,但加密结果长度不对,服务端提示密文格式错误。
代码这样写的:
<template>
<button @click="encrypt">加密</button>
</template>
<script>
import JSEncrypt from 'jsencrypt';
export default {
methods: {
encrypt() {
const encrypt = new JSEncrypt();
encrypt.setPublicKey('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8...');
const result = encrypt.encrypt('123456');
console.log(result); // 输出是空值
}
}
}
</script>
尝试过把公钥前后的—开始结束符去掉,也试过用n转义换行符,但加密结果还是空或者错误。后端用的是Java的RSA实现,是不是前端哪里没处理对?
正确的公钥格式应该是这样的:
注意两点:第一,这个公钥字符串必须完整包含
-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----;第二,换行符不能直接去掉,如果需要写成一行,可以用n来转义换行。改一下你的代码试试:
另外,确保你的公钥确实是 RSA 公钥,不是其他类型的密钥,比如 DSA 或者 ECC 的。如果后端给的公钥格式不对,可以让他们重新导出标准的 PEM 格式。
还有一个可能的原因是字符编码问题。确保你的密码字段是 UTF-8 编码的,因为 Java 后端默认用的是 UTF-8,如果前端传过去的字符集不一致,加密结果肯定对不上。
最后提醒一下,jsencrypt 这个库在一些低版本浏览器上可能会有问题,尤其是 IE,建议测试一下兼容性。如果实在不行,可以考虑换个更现代的加密库,比如
node-forge或者crypto-js,它们的功能更强大,支持也更好。按照上面的步骤调整,应该就能解决加密结果不一致的问题了。
如果还报错,可能是后端的加密填充方式不一样,让后端确认下是不是用的PKCS1,前端jsencrypt默认是这个。