前端加密方式
阿新 • • 發佈:2021-01-23
技術標籤: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-----'
-
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----'
-
二、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