我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

苏南大叔在本文中描述一款开源代码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加密解密的博客文章,请点击苏南大叔的博客链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

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

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