CryptoJS的使用引入

CryptoJS是原生javascript写的加密类库,提供了各种编码和加密算法,如MD5、SHA-1、SHA-256、AES、HMAC、PBKDF等。
以常见的Md5摘要及Base64编码为例,测试代码如下:

index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>测试加密</title>
</head>
<body>
<script src="js/jquery-3.2.1.js" type="text/javascript"></script>
<script src="js/core.js" type="text/javascript"></script>
<script src="js/md5.js" type="text/javascript"></script>
<script src="js/enc-base64.js" type="text/javascript"></script>
<script src="js/main.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
console.log("-----start------");
var origin = "a12345678";
console.log("origin string is :" + origin);
console.log("md5 hex string is :" + md5HexUtil(origin));
console.log("md5 byte direct to base64 method1 is :" + md5ByteDirectToBase64UtilMethod1(origin));
console.log("md5 byte direct to base64 method2 is :" + md5ByteDirectToBase64UtilMethod2(origin));
console.log("base4 encode finish :" + base64Encode(origin));
console.log("base4 decode finish :" + base64Decode(base64Encode(origin)));
console.log("md5 hex string, and then base4 is :" + base64Encode(md5HexUtil(origin)));
console.log("-----end--------");
});
</script>
</body>
</html>

main.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
* Md5摘要,转为16进制字符串(Md5字节数组转String默认即是十六进制)
*/
function md5HexUtil(value){
return CryptoJS.MD5(value).toString(CryptoJS.enc.HEX);
}
/**
* Md5摘要,直接将字节流转为Base64
* 方法一:
*/
function md5ByteDirectToBase64UtilMethod1(value){
return CryptoJS.MD5(value).toString(CryptoJS.enc.Base64);
}
/**
* Md5摘要,直接将字节流转为Base64
* 方法二:
*/
function md5ByteDirectToBase64UtilMethod2(value){
var base64 = CryptoJS.enc.Base64.stringify(CryptoJS.MD5(value));
return base64;
}
/**
* base64编码
*/
function base64Encode(value){
var wordArray = CryptoJS.enc.Utf8.parse(value);
var base64 = CryptoJS.enc.Base64.stringify(wordArray);
return base64;
}
/**
* base64解码
*/
function base64Decode(base64){
var parsedWordArray = CryptoJS.enc.Base64.parse(base64);
var parsedStr = parsedWordArray.toString(CryptoJS.enc.Utf8);
return parsedStr;
}

运行结果

1
2
3
4
5
6
7
8
9
-----start------
test.html:17 origin string is :a12345678
test.html:18 md5 hex string is :e9bc0e13a8a16cbb07b175d92a113126
test.html:19 md5 byte direct to base64 method1 is :6bwOE6ihbLsHsXXZKhExJg==
test.html:20 md5 byte direct to base64 method2 is :6bwOE6ihbLsHsXXZKhExJg==
test.html:21 base4 encode finish :YTEyMzQ1Njc4
test.html:22 base4 decode finish :a12345678
test.html:23 md5 hex string, and then base4 is :ZTliYzBlMTNhOGExNmNiYjA3YjE3NWQ5MmExMTMxMjY=
test.html:24 -----end--------

值得注意的是:
MD5转为字符串再进行Base64编码(第一种)

MD5字节数组直接进行Base64编码(第二种)
的输出结果不同。
原因是Md5结果为128bit,转字符串时,算法默认使用16进制,每4bit为一个字节,结果得到32字节长度的定长字符串,再进行base64编码,得到44字节长度的字符串; 而第二种Md5字节流直接进行Base64编码,1字节=8bit,128bit即16字节,base64编码后为24字节。

扩展

算法 bit byte
MD5 128 32
SHA1 160 40
SHA224 224 56
SHA256 256 64
SHA384 384 96
SHA512 512 128
  • 数据摘要算法不是加密算法,因为不可逆。常见的数据摘要算法位数及转为字符串所占字节数如上表
  • js默认使用iso8859-1编码,几乎对于编码(utf8、unicode、gbk、ASCII),英文数字等简单字符(码表中序列0-255)的编码,1字符=1字节
  • base64编码会把3字节的二进制数据编码为4字节的文本数据,转换过程不足3字节,末尾补足\x00,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码时再去掉。=在URL、Cookie里会造成歧义,所以,有些base64编码后会把=去掉
  • Md5摘要的字符串长度为32字节,16字节的Md5摘要是取32字节的中间16字节。如a12345678的摘要,32位为:e9bc0e13a8a16cbb07b175d92a113126,16位为:a8a16cbb07b175d9