最近的项目遇到了前端需要加密数据的需求,了解了一下使用AES算法的是比较多的。那么使用什么方法在前端实现AES算法呢?后来发现前端的各种加密/解密的算法基本都被一个叫CryptoJS的包给垄断了!福哥捣鼓了一下,这个CryptoJS包确实很强大!
今天福哥就把这个使用CryptoJS实现AES算法的方法教给大家,有需要的可以拿去使用~
下载CryptoJS库,可以从官方的github上面下载,也可以通过npm来安装。
https://github.com/sytelus/CryptoJS
引入CryptoJS的md5库和aes库。
<script type="text/javascript" src="../js/libs/CryptoJS/rollups/md5.js"></script> <script type="text/javascript" src="../js/libs/CryptoJS/rollups/aes.js"></script>
现在可以写代码了!准备一个需要加密的数据,和一个密钥。
// origin
console.log("====== prepare ======");
data = "码友:可以教教我如何使用CryptoJS库实现AES算法的前端加密/解密吗?我在tongfu.net上没有找到。";
passphrase = "福哥:好的!现在就弄!";
console.log("data:", data);
console.log("passphrase:", passphrase);这里是福哥写的一个AES+CBC的加密函数。
function aesEncrypt(data, passphrase){
var key, iv, hKey, hIV, dataEncRes;
// make key & iv
key = CryptoJS.MD5(passphrase).toString();
iv = key.substr(0, 16);
hKey = CryptoJS.enc.Hex.parse(key);
hIV = CryptoJS.enc.Hex.parse(iv);
// encrypt
dataEncRes = CryptoJS.AES.encrypt(
data,
hKey,
{
iv: hIV,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return dataEncRes;
}现在福哥使用aesEncrypt这个函数来加密准备好的数据。
// encrypt
console.log("====== encrypt ======");
dataEncRes = aesEncrypt(data, passphrase);
dataEncStr = dataEncRes.toString();
dataEncCipherTextStr = dataEncRes.ciphertext.toString();
console.log("data encoded result:", dataEncRes);
console.log("data encoded string:", dataEncStr);
console.log("data encoded ciphertext:", dataEncCipherTextStr);这里是福哥写的一个AES+CBC的解密函数。
function aesDecrypt(dataEncoded, passphrase){
var key, iv, hKey, hIV, dataDecRes;
// make key & iv
key = CryptoJS.MD5(passphrase).toString();
iv = key.substr(0, 16);
hKey = CryptoJS.enc.Hex.parse(key);
hIV = CryptoJS.enc.Hex.parse(iv);
// decrypt
dataDecRes = CryptoJS.AES.decrypt(
dataEncoded,
hKey,
{
iv: hIV,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return dataDecRes;
}现在福哥使用aesDecrypt这个函数来解密刚刚加密后的数据。加密的数据包括十进制格式的,还有十六进制(Hex)格式的。
我们先来解密十进制格式的,十进制格式的可以直接解密。
// decrypt
console.log("====== decrypt ======");
dataDecRes = aesDecrypt(dataEncStr, passphrase);
dataDecStr = dataDecRes.toString(CryptoJS.enc.Utf8);
console.log("data decoded result:", dataDecRes);
console.log("data decoded string:", dataDecStr);接着我们来解密十六进制(Hex)格式的,这里需要先把它转换成十进制格式的,然后再来解密。
// decrypt by ciphertext
console.log("====== decrypt ciphertext ======");
dataEncStr = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(dataEncCipherTextStr));
console.log("data encoded string:", dataEncStr);
dataDecRes = aesDecrypt(dataEncStr, passphrase);
dataDecStr = dataDecRes.toString(CryptoJS.enc.Utf8);
console.log("data decoded result:", dataDecRes);
console.log("data decoded string:", dataDecStr);这是执行结果!大家的环境下如果结果不一样,请仔细检查~
