苏南大叔在本文中描述一款开源代码jsencrypt,主要功能就是在前端js中,对敏感数据进行RSA加密,同一个数据每次加密的结果,并不一致,但是在服务器端都能够解密出唯一数据。当然,这款jsencrypt也自带前端js解密功能。

苏南大叔:js如何使用RSA加密或解密数据?jsencrypt使用指南 - jsencrypt-rsa
js如何使用RSA加密或解密数据?jsencrypt使用指南(图5-1)

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

苏南大叔:js如何使用RSA加密或解密数据?jsencrypt使用指南 - jsencrypt-rsa
js如何使用RSA加密或解密数据?jsencrypt使用指南(图5-2)

下载jsencrypt

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

其官方主页是:

苏南大叔:js如何使用RSA加密或解密数据?jsencrypt使用指南 - jscrypt-github-download
js如何使用RSA加密或解密数据?jsencrypt使用指南(图5-3)

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

苏南大叔:js如何使用RSA加密或解密数据?jsencrypt使用指南 - jsencrypt-master-bin
js如何使用RSA加密或解密数据?jsencrypt使用指南(图5-4)

处理密钥对

可以参考下面的文字,获得一对密钥:

在接下来的范例代码中,公钥私钥就是一行文本。包含着每个字符,并且没有换行。对于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);

苏南大叔:js如何使用RSA加密或解密数据?jsencrypt使用指南 - rsa-encode-decode
js如何使用RSA加密或解密数据?jsencrypt使用指南(图5-5)

使用私钥解密数据

下面的代码是使用jsencrypt对数据进行RSA私钥解密的基本姿势:

var decrypt = new JSEncrypt();
decrypt.setPrivateKey("<这里放置私钥文本>");
var uncrypted = decrypt.decrypt("<这里放置加密完的文本>");
console.log(uncrypted);

注意:在这里,解密失败是会返回一个false的,可以作为大家判断是否解密成功的判断依据。

signverify功能

官方还提供了签名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加密解密的博客文章,请点击苏南大叔的博客链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接作者。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
未经许可,规模化镜像抄袭本站内容的行为,将会根据有关法律法规进行维权。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

 【加群】加入QQ群【175454274】和大家一起讨论这个问题

 【源码】本文代码片段及相关软件,请点此获取

 【绝密】秘籍文章入口,仅传授于有缘之人   rsa    jsencrypt

本站的忠实读者小伙伴,正在阅读下面这些文章: