一、需求
應業務要求,需對請求數據進行AES加密,常用框架為CryptoJS。
二、CryptoJS
git地址:https://github.com/brix/crypto-js
API: https://cryptojs.gitbook.io/docs/#hmac
CryptoJS官方:https://code.google.com/archive/p/crypto-js/(需FQ)
三、使用
仔細閱讀CryptoJS項目的readME就可以獲取到該插件的使用方法。我剛開始使用的是ES6模式全部引入CryptoJS,打包之后發現有點大,而后端要求使用AES的CFB模式,padding為Nopadding,並要求加密輸出為HEX格式,所以我選擇按需引入。
1、從readme里獲取信息
readMe當中很明確地寫了使用方法,如下圖
在readME的List of modules中列出了所有的模塊,可根據需要自行引入使用(框起來的就是我需要用到的模塊),如下:
2、demo-js文件引入
從官網(https://code.google.com/archive/p/crypto-js/)下載資源文件
解壓縮后得到如下文件
我們使用rollups里的aes.js文件,並根據需要使用component文件夾下的相關文件,拷貝出來使用即可。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>數據加密</title> </head> <body> <button id="btnSub">點擊測試</button><span style="color: red;">需打開控制台,查看輸出</span> <script src="./aes.js"></script> <script src="./format-hex-min.js"></script> <script src="./pad-nopadding-min.js"></script> <script src="./mode-cfb-min.js"></script> <script> let oBtn = document.getElementById('btnSub'); console.log(CryptoJS, CryptoJS.pad) function test(data, key, iv) { data = CryptoJS.enc.Utf8.parse(JSON.stringify(data)) key = CryptoJS.enc.Utf8.parse(key) iv = CryptoJS.enc.Utf8.parse(iv) // Encrypt var ciphertext = CryptoJS.AES.encrypt(data, key, { iv: iv, mode: CryptoJS.mode.CFB, padding: CryptoJS.pad.NoPadding }); console.log(ciphertext.toString(), ciphertext.ciphertext.toString()); // Decrypt var bytes = CryptoJS.AES.decrypt(ciphertext, key, { iv: iv, mode: CryptoJS.mode.CFB, padding: CryptoJS.pad.NoPadding }); var originalText = bytes.toString(CryptoJS.enc.Utf8); console.log(originalText); } oBtn.onclick = function () { let key = 'bzKvXm8iDXuPT15n', iv = '8392839dje837uji', data = { "name": '用腦袋行走的人', "age": "18" } test(data, key, iv); } </script> </body> </html>
加解密測試,控制台輸出如下:
提示:只引入aes.js之后mode下只有CBC,pad下只有Pkcs7,也就是默認值。如果有不同需求可引入相應的component,就如我引入的CFB一樣。
3、我的使用-ES6引入
以上是我起的小demo,而項目使用的是vue,我這里選擇使用ES6模式的引用,,步驟及代碼如下
A、安裝CryptoJS
npm install crypto-js --save
B、引用
// 按需引入
import CFB from 'crypto-js/mode-cfb'//CFB模式 import UTF8 from 'crypto-js/enc-utf8' import Nopadding from 'crypto-js/pad-nopadding' //這里使輸出HEX格式 ... // 加密函數 function encrypt (data, key, iv) { data = UTF8.parse(JSON.stringify(data)) key = UTF8.parse(key) iv = UTF8.parse(iv) // 加密 var ciphertext = AES.encrypt(data, key, { iv: iv, mode: CFB, padding: Nopadding }) let result = ciphertext.ciphertext.toString() //這里返回的是HEX格式 return result }
你可以根據自身需求,按上述方式實現按需引入,就會使打包之后的文件小很多啦~
3、總結
因為之前簡單看了下CryptoJS插件git官方文件,沒有詳細研究,然后根據需求在網上盲目查找相關資源,走了不少彎路,也浪費了不少時間,結果踏破鐵鞋無覓處,答案就在readme中。所以一定要學會使用官方文件!!!
轉載請注明出處,謝謝啦~