<center>
使用Crypto-JS進(jìn)行AES加密
</center>
<P>在最近的項(xiàng)目中,調(diào)用登錄接口的猛,需要對(duì)賬號(hào)密碼數(shù)據(jù)進(jìn)行AES加密后再進(jìn)行傳輸,使用的是AES/ECB/PKCS5Padding
,我前端部分使用選擇了CryptoJS
,現(xiàn)在把使用的過(guò)程記錄如下。
需要注意的點(diǎn)
- Crypto-JS的encrypt函數(shù)不會(huì)返回字符串徙垫,需要調(diào)用對(duì)象的toString方法饺汹,或者通過(guò)Crypto-js轉(zhuǎn)碼才能得到真實(shí)的結(jié)果蛔添。
使用步驟
- 引入
Crypto-JS
中的aes.js
及相關(guān)模塊
"bower_components/cryptojs/aes.js",
"bower_components/cryptojs/enc-utf8.js",
"bower_components/cryptojs/pad-pkcs7.js",
"bower_components/cryptojs/mode-ecb.js"
- 調(diào)用CryptoJS.AES
// 官方示例, 每次輸出的密文都不一樣,這樣使用的話是錯(cuò)誤的
CryptoJS.AES.encrypt("Message", "Secret Passphrase");
/* 正確的使用姿勢(shì)!兜辞! */
// 使用用戶名進(jìn)行MD5迎瞧,32位,作為key
var key_str = md5.createHash(username);
// 將key轉(zhuǎn)換成128 bit
var key = CryptoJS.enc.Utf8.parse(key_str);
// 對(duì)password進(jìn)行AES加密
var AESPass = CryptoJS.AES.encrypt(password, key, {
mode: CryptoJS.mode.ECB, //補(bǔ)齊方式 CBC,ECB,etc.
padding: CryptoJS.pad.Pkcs7 // 偏移規(guī)則設(shè)定 pack5逸吵,pkcs7凶硅,nopadding,etc.
});
// CryptoJS 的 encrypt函數(shù)不會(huì)直接返回字符串,需要toString或者Crypto-JS進(jìn)行轉(zhuǎn)碼才能得到真實(shí)的結(jié)果扫皱。
var pass = AESPass.toString();
var authData = Base64.encode(username + ':' + pass).replace(/[\r\n]/g, ''); // 去除回車換行符
使用AngularJS的方式調(diào)用CryptoJS.AES
- 使用Angular將
AES
封裝成一個(gè)provider
- 提供兩種方式設(shè)置key
// 1. 一種為在angular.module('xxxx').config中進(jìn)行設(shè)置足绅,此種方式適用于key為一個(gè)固定值的情況
CryptoKeyProvider.setCryptofraphyKey('key') // 在config中設(shè)置key
$crypto.encrypto('plaintext') // 在業(yè)務(wù)邏輯處直接傳入需要加密的明文進(jìn)行調(diào)用
// 2. 第二種方式,每次都設(shè)置不同的key
$crypto.encrypto('plaintext','key')
- 具體源碼如下:
注意:解密時(shí)捷绑,需要先將密文轉(zhuǎn)換成
Base64
的編碼的格式。
- 使用
CryptoJS.enc.Hex.parse
轉(zhuǎn)換成十六進(jìn)制- 使用
CryptoJS.enc.Base64.stringify
將其變成Base64編碼的字符串- 最后才能傳入
CryptoJS.AES.decrypt
方法對(duì)其解密