vue使用 jsencrypt 和 node-rsa 实现 RSA加密/解密,完善系统安全
公司突然接了一个基于vue的独立项目,需要前端实现 RSA加密/解密 确保足够安全。
1.什么是RSA?它足够安全吗?RSA是一种算法。
RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相同的算法,但他的发现被列入机密,一直到1997年才被发表。对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到2013年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
2,在哪儿可以加密?怎么获取公钥和私钥?
https://oktools.net/rsa 通过这个网站大家可以随意获取秘钥和加密后的密文。
3.前端怎么用公钥加密?
重头戏来了
①引入 jsencrypt
cnpm install --save jsencrypt
import { JSEncrypt } from "JSEncrypt";
②
var data = '中华人民共和国万岁!!' const PUBLIC_KEY = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7YZYIUV9AxG/RTvR8oGLnyzrM iYHDaRXvPxJiro46RbjcrLtXNC2T6o+q1KuPwTcwp37tEab1wZ3zZRbgk74dYubl Q9YOs3vO0dXj1AfurLxkHXc8kezcBT+roGqNF90oo0lFfz7X3QrCsc6u+3PA4pnR YiR3IdgGawRYVuNAkQIDAQAB` // 使用公钥加密 const encrypt = new JSEncrypt() //new encrypt.setPublicKey(PUBLIC_KEY) //公钥赋值 let result = encrypt.encrypt(data) //加密字段 console.log(result)

成功加密的密文,也可以在 https://oktools.net/rsa 里面解密 看看加密是否成功
4.前端怎么用私钥解密?
方法和加密差不多,只有部分不同
const PRIVATE_KEY = `MIICXwIBAAKBgQC7YZYIUV9AxG/RTvR8oGLnyzrMiYHDaRXvPxJiro46RbjcrLtX NC2T6o+q1KuPwTcwp37tEab1wZ3zZRbgk74dYublQ9YOs3vO0dXj1AfurLxkHXc8 kezcBT+roGqNF90oo0lFfz7X3QrCsc6u+3PA4pnRYiR3IdgGawRYVuNAkQIDAQAB AoGBAIpDeZdto6GA0Rla7yA+oHx1A1AFbtCn6917Zq+WKbBp3fxHIH06LR9mBtiA 0I7kfTrTfN6lFdNlKI1+XCEeIzr8Xm/Rd3tfqzugcXlbWUXG1mfnJ8BFX3nze37t mK7lIuZHC5NTJrMoMYwmAhCITHcibuqeD4u6nkH5blnGxG65AkEA4xUXa/UHggtX kkerWxU1qQfSl13CXexXOy7hYJyxHH1FqFVE4GasXLA0lb2cjsGD/hWihWousnQJ pPLBbaNIKwJBANM+O1ITS0bKn7HrBdkqc03yAUTL4hVtE/Yys0SlD/KDhHFoutf8 cRbwWRwmd4OXl3R/ikK6jHs9ABbcmi1DoDMCQQDW0eccW+rEXVJ0sZQrUD85LotM YogzLhe/hzPyn4j1OJUjD7deygKYlKDKX1uxuOPTBEiBCdgvPZK6FmRiAauNAkEA xdtcJJv9vei7eyHu8GFabn9lwNJWiEsKj2cdkgYo0bVtr+uwVe0U369vR3agKpkq OuvazHV+b0/LbZ5iqlLVEQJBAMevvbBf/cEGh4r2kCLj+dtt6eDs3P3e5HsHU24p YHsS610s+osGPsidn8MBqKtkZBbJMcXTo1vIV4doHw+hvVM=` //使用私钥解密 const decrypt = new JSEncrypt() decrypt.setPrivateKey(PRIVATE_KEY) let result1 = decrypt.decrypt(result) console.log(result1)
5,前端如何私钥加密 (这个需求说出来都让我目瞪口呆。所幸后面还是解决了)
引入 node-rsa 可能 jsencrypt 也可以实现,因为项目比较急,使用就没继续研究了
cnpm install --save node-rsa
const NodeRSA = require("node-rsa"); // 引入node-rsa
let newdata = "中华人民共和国万岁";
let pbk2 = `-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgHMi1DlTI5RN26Gume5o8rDMBhlvkJ1Afw0WV6Hn89RBkUuKdiLg
yIWSB03MAmjEw4jH4j//2A0YxbUYZ9uigdW16hW8ZoImtG2FmZo80f4XizBxfIvW
Xp0N4GkZdbwOIf0o5INpMZvydZkfoLiLgmJSeBXgWpOjNeOWQSBkLd4hAgMBAAEC
gYAguHg5pmAJKKtPYrCKabb2+bSOC/+8QPUaggv7jlDkNJIXNs1mEh3Kn/qFaIIS
xkCPocaxy4LaDf05/yqc560f7Be76v7Ezll1UqzK0nQeO0qmyPpuQJZsuuKievur
AIL06Uu2Lnnh8vfDjRdWlwYhVcQYwSWj36hixez35JZ4AQJBANcCWGmCq3Hed4TQ
r5QRd+VrsDYTQynKpZb2swZTZbQbJIwlFr21kOWMudJAWYJlbmQOqaUt9CZTGddi
lk/CxeECQQCJFh1rJ3d3RLjurl5HSY1WaU9xSd+be9N9WrQdTalh7kAmUAPVnKr5
pKYch0KXn+/86CTrPe15AZkuKnSPraBBAkEAlZuaLYCxD0C/ZXlYUu18wfSW3mm0
2EWbx1nN5F7va81fNu0vz72hHzk2q6f/II63q4PQY5GAS5KTbp24/bMHwQJAJgep
j6F6Re8dsrFS3EnuWMuMS2xoCRVX/Y2dLAfwdoeG6loGRktZLzpbDs0DT1cCV9H6
8/vRFmG4IhOLFJThQQJBAJDRv/56tnBSFbI1+3gfrW72dR3jF5QdqW1xq8Io1VLT
ytw4xfvqaDfUmzb1ZkwJnmGKjZwZHjydUdfpsRfq5x8=
-----END RSA PRIVATE KEY-----`;
const nodersa = new NodeRSA(pbk2);
const decrypted = nodersa.encryptPrivate(newdata, 'base64',"utf8");
console.log(decrypted);

成功加密!!!
6,前端使用公钥解密
const privateKey = `-----BEGIN PUBLIC KEY----- MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHMi1DlTI5RN26Gume5o8rDMBhlv kJ1Afw0WV6Hn89RBkUuKdiLgyIWSB03MAmjEw4jH4j//2A0YxbUYZ9uigdW16hW8 ZoImtG2FmZo80f4XizBxfIvWXp0N4GkZdbwOIf0o5INpMZvydZkfoLiLgmJSeBXg WpOjNeOWQSBkLd4hAgMBAAE= -----END PUBLIC KEY-----`; const nodersa2 = new NodeRSA(privateKey); const decrypted2 = nodersa2.decryptPublic(decrypted, "utf8"); console.log(decrypted2);

成功解密。nice!!!!!

浙公网安备 33010602011771号