js如何使用RSA加密或解密数据?jsencrypt使用指南
发布于 作者:苏南大叔 来源:程序如此灵动~
苏南大叔在本文中描述一款开源代码jsencrypt,主要功能就是在前端js中,对敏感数据进行RSA加密,同一个数据每次加密的结果,并不一致,但是在服务器端都能够解密出唯一数据。当然,这款jsencrypt也自带前端js解密功能。

本文测试环境:mac/chrome/jsencrypt@3.0.0-rc.1。从下图可以看到,每次加密的结果都不一样:

下载jsencrypt
这款RSA加密源码库jsencrypt,截至到发稿,其最新版本为3.0.0-rc.1。其github地址是:
其官方主页是:

下载到的压缩包里面的bin/jsencrypt.min.js,才是真正需要的用在网页里面的js引用文件。如果您需要对源码自行编译,请使用gulp工具进行编译。

处理密钥对
可以参考下面的文字,获得一对密钥:
在接下来的范例代码中,公钥私钥就是一行文本。包含着每个字符,并且没有换行。对于js代码来说,您可能需要手工删除一下公钥和私钥的每个换行符,合并成一行文本。特别注意的是:
- 要保留开头结尾的注释
- 要保留空格
当然这里也有个苏南大叔写的js替换换行符号的代码,仅供参考:
var i = document.getElementById("private").value;
i = i.replace(new RegExp("\n","gm"),"");
i = i.replace(new RegExp("\r","gm"),"");
//i = i.replace(new RegExp(" ","gm"),"");
document.getElementById("private").value = i;使用公钥加密数据(常用)
下面的代码,是使用jsencrypt对数据进行RSA公钥加密的基本姿势:
var encrypt = new JSEncrypt();
encrypt.setPublicKey("<这里放置公钥文本>");
var encrypted = encrypt.encrypt("<这里放置要加密的文本>");
console.log(encrypted);
使用私钥解密数据(可能不常见)
下面的代码是使用jsencrypt对数据进行RSA私钥解密的基本姿势:
var decrypt = new JSEncrypt();
decrypt.setPrivateKey("<这里放置私钥文本>");
var uncrypted = decrypt.decrypt("<这里放置加密完的文本>");
console.log(uncrypted);注意:在这里,解密失败是会返回一个false的,可以作为大家判断是否解密成功的判断依据。
sign和verify功能
官方还提供了签名sign和签名校验verify的功能,不过苏南大叔暂时也用不到,所以这两个功能暂存。
var sign = new JSEncrypt();
sign.setPrivateKey(“<这里放置私钥文本>”);
var signature = sign.sign(“<这里放置文本>”, CryptoJS.SHA256, "sha256");
// Verify with the public key...
var verify = new JSEncrypt();
verify.setPublicKey($("<这里放置公钥文本>");
var verified = verify.verify(“<这里放置签名文本>”, CryptoJS.SHA256);特别说明
因为对于苏南大叔来说,更多的使用情况是:在前端加密用户输入的数据,然后在后端进行解密。那么jsencrypt的加密解密功能,苏南大叔其实也就用得到其中的加密功能。
另外,在日常使用过程中,苏南大叔建议您:
- 仅用于加密数字字母等简单字符,而对于中文字符,特别是一些生僻字,会发生解密失败的情况。
- 同其它的加密算法一样,加密完成后,字符串体积会明显增加,所以尽量不要用于加密较长数据。
总结
更多rsa加密解密的博客文章,请点击苏南大叔的博客链接: