1. 程式人生 > 其它 >前端加密方式

前端加密方式

技術標籤:js

總結下專案中用到的一些加密方式:

一、RSA

專案的登入頁面要加密使用者名稱和密碼,前端利用RSA進行加密,後端用java實現的解密過程

使用JSEncrypt.js外掛(jsencrypt就是一個基於rsa加解密的js庫)

  • 使用公鑰加密的資料,利用私鑰進行解密

  • 使用私鑰加密的資料,利用公鑰進行解密

  • 前端大概的加密流程

    • 前端呼叫後端公鑰的介面獲取公鑰---->
    • 前端使用JSEncrypt中介軟體設定公鑰,並加密密碼---->
    • 前端將加密後的資料通過介面(如登入介面)傳給後臺---->
    • 後臺使用金鑰解密前端加密的資料,再用解密後的資料查詢或者儲存到資料庫中
  • 使用過程

    • 安裝

        npm install jsencrypt
      
    • 引入

        import JSEncrypt from 'jsencrypt'
      
    • ras加密

        let encryptStr = new JSEncrypt()  // 建立加密物件例項
        let pubKey = '-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1QQRl0HlrVv6kGqhgonD6A9SU6ZJpnEN+Q0blT/ue6Ndt97WRfxtSAs0QoquTreaDtfC4RRX4o+CU6BTuHLUm+eSvxZS9TzbwoYZq7ObbQAZAY+SYDgAA5PHf1wNN20dGMFFgVS/y0ZWvv1UNa2laEz0I8Vmr5ZlzIn88GkmSiQIDAQAB-----END PUBLIC KEY-----'
      //獲取後端傳給的公鑰 encryptStr.setPublicKey(pubKey)//設定公鑰 let rsaPassWord = encryptStr.encrypt('要加密的內容') // 對內容進行加密
    • rsa解密

        var decryptStr = new JSEncrypt()//建立解密物件例項
        var priKey  = '-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQC1QQRl0HlrVv6kGqhgonD6A9SU6ZJpnEN+Q0blT/ue6Ndt97WRfxtSAs0QoquTreaDtfC4RRX4o+CU6BTuHLUm+eSvxZS9TzbwoYZq7ObbQAZAY+SYDgAA5PHf1wNN20dGMFFgVS/y0ZWvv1UNa2laEz0I8Vmr5ZlzIn88GkmSiQIDAQABAoGBAKYDKP4AFlXkVlMEP5hS8FtuSrUhwgKNJ5xsDnFV8sc3yKlmKp1a6DETc7N66t/Wdb3JVPPSAy+7GaYJc7IsBRZgVqhrjiYiTO3ZvJv3nwAT5snCoZrDqlFzNhR8zvUiyAfGD1pExBKLZKNH826dpfoKD2fYlBVOjz6i6dTKBvCJAkEA/GtL6q1JgGhGLOUenFveqOHJKUydBAk/3jLZksQqIaVxoB+jRQNOZjeSO9er0fxgI2kh0NnfXEvH+v326WxjBwJBALfTRar040v71GJq1m8eFxADIiPDNh5JD2yb71FtYzH9J5/d8SUHI/CUFoROOhxr3DpagmrnTn28H0088vubKe8CQDKMOhOwx/tS5lqvN0YQj7I6JNKEaR0ZzRRuEmv1pIpAW1S5gTScyOJnVn1tXxcZ9xagQwlT2ArfkhiNKxjrf5kCQAwBSDN5+r4jnCMxRv/Kv0bUbY5YWVhw/QjixiZTNn81QTk3jWAVr0su4KmTUkg44xEMiCfjI0Ui3Ah3SocUAxECQAmHCjy8WPjhJN8y0MXSX05OyPTtysrdFzm1pwZNm/tWnhW7GvYQpvE/iAcNrNNb5k17fCImJLH5gbdvJJmCWRk=-----END RSA PRIVATE KEY----'
      decryptStr.setPrivateKey(priKey)//設定祕鑰 let uncrypted = decryptStr.decrypt('解密的內容')//解密之前拿公鑰加密的內容

二、md5

  • 安裝

     npm install --save js-md5
    
  • 引入

     import md5 from 'js-md5';
    
  • md5加密

     md5('hello world') // 5eb63bbbe01eeed093cb22bb8f5acdc3
    

三、AES

使用AES實現密碼加密解密,主要是通過ecb和cbc兩種模式

ECB: 是一種基礎的加密方式,密文被分割成分組長度相等的塊(不足補齊),然後單獨一個個加密,一個個輸出組成密文。

CBC: 是一種迴圈模式,前一個分組的密文和當前分組的明文異或或操作後再加密,這樣做的目的是增強破解難度。(不容易主動攻擊,安全性好於ECB,是SSL、IPSec的標準)

使用過程:

  • 先安裝 crypto-js

     npm install crypto-js --save-dev
    
  • ECB模式:

    import CryptoJS from "crypto-js";
     
    // 加密
    encrypt(word, keyStr) {
      // @param keyStr string 加密key(16位)
      // @param word string 要加密的內容
      keyStr = keyStr ? keyStr : "absoietlj32fai12";
      let key = CryptoJS.enc.Utf8.parse(keyStr);
      let srcs = CryptoJS.enc.Utf8.parse(word);
      let encrypted = CryptoJS.AES.encrypt(srcs, key, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
      });
      return encrypted.toString();
    },
    // 解密
    decrypt(word, keyStr) {
      keyStr = keyStr ? keyStr : "absoietlj32fai12";
      var key = CryptoJS.enc.Utf8.parse(keyStr);
      var decrypt = CryptoJS.AES.decrypt(word, key, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
      });
      return CryptoJS.enc.Utf8.stringify(decrypt).toString();
    }
    
  • CBC模式:

    import CryptoJS from "crypto-js";
    
    // 加密
    encrypt(word, keyStr, ivStr) {
      keyStr = keyStr ? keyStr : "absoietlj32fai12";
      ivStr = ivStr ? ivStr : "absoietlj32fai12";
      let key = CryptoJS.enc.Utf8.parse(keyStr);
      let iv = CryptoJS.enc.Utf8.parse(ivStr);
      let srcs = CryptoJS.enc.Utf8.parse(word);
    
      let encrypted = CryptoJS.AES.encrypt(srcs, key, {
        iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.ZeroPadding
      });
      return encrypted.toString();
    },
    // 解密
    decrypt(word, keyStr, ivStr) {
      keyStr = keyStr ? keyStr : "absoietlj32fai12";
      ivStr = ivStr ? ivStr : "absoietlj32fai12";
      var key = CryptoJS.enc.Utf8.parse(keyStr);
      let iv = CryptoJS.enc.Utf8.parse(ivStr);
    
      var decrypt = CryptoJS.AES.decrypt(word, key, {
        iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.ZeroPadding
      });
      return decrypt.toString(CryptoJS.enc.Utf8);
    }
    

參考網址:https://www.jb51.net/article/167504.htm