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!!!!!

 

posted @ 2021-05-27 20:03  fanjiajia  阅读(3144)  评论(0)    收藏  举报