Vue中用jsencrypt加密RSA后结果与服务端不一致怎么办?

程序员艺涵 阅读 33

我在做一个登录接口需要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实现,是不是前端哪里没处理对?

我来解答 赞 6 收藏
二维码
手机扫码查看
2 条解答
♫斯羽
♫斯羽 Lv1
你这个问题主要是公钥格式不对导致的,我遇到过好几次这种坑了。前端用 jsencrypt 加密的时候,公钥必须是标准的 PEM 格式,而且不能随便去掉前后缀。

正确的公钥格式应该是这样的:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8...
-----END PUBLIC KEY-----


注意两点:第一,这个公钥字符串必须完整包含 -----BEGIN PUBLIC KEY----------END PUBLIC KEY-----;第二,换行符不能直接去掉,如果需要写成一行,可以用 n 来转义换行。

改一下你的代码试试:
encrypt() {
const encrypt = new JSEncrypt();
const publicKey = -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8...
-----END PUBLIC KEY-----
;
encrypt.setPublicKey(publicKey);
const result = encrypt.encrypt('123456');
console.log(result); // 应该能正常输出加密结果
}


另外,确保你的公钥确实是 RSA 公钥,不是其他类型的密钥,比如 DSA 或者 ECC 的。如果后端给的公钥格式不对,可以让他们重新导出标准的 PEM 格式。

还有一个可能的原因是字符编码问题。确保你的密码字段是 UTF-8 编码的,因为 Java 后端默认用的是 UTF-8,如果前端传过去的字符集不一致,加密结果肯定对不上。

最后提醒一下,jsencrypt 这个库在一些低版本浏览器上可能会有问题,尤其是 IE,建议测试一下兼容性。如果实在不行,可以考虑换个更现代的加密库,比如 node-forge 或者 crypto-js,它们的功能更强大,支持也更好。

按照上面的步骤调整,应该就能解决加密结果不一致的问题了。
点赞 1
2026-02-17 16:07
设计师士俊
公钥格式不对或者换行符有问题,我一般直接这么处理:把公钥完整带上---BEGIN PUBLIC KEY---和---END PUBLIC KEY---,然后确保换行符是n。你试试下面的代码。

import JSEncrypt from 'jsencrypt';

export default {
methods: {
encrypt() {
const encrypt = new JSEncrypt();
const publicKey = -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8...
-----END PUBLIC KEY-----
;
encrypt.setPublicKey(publicKey);
const result = encrypt.encrypt('123456');
console.log(result); // 看看输出是不是正常了
}
}
}


如果还报错,可能是后端的加密填充方式不一样,让后端确认下是不是用的PKCS1,前端jsencrypt默认是这个。
点赞
2026-02-14 18:18