本节内容
1、简述
2、加密
3、sha1加密
4、sha256加密
5、sha384加密
6、sha512加密
7、hmac加密
一、简述
我们写程序中,经常需要对字符串进行MD5加密,python中也支持这种加密,下面说说,这个加密模块:hashlib。
二、MD5加密
原则:只要你的输入是固定的,你的输出也一定是固定的。MD5是在hash上更改的,主要做文件的一致性
1、md5加密
1
2
3
4
5
6
7
8
9
10
11
12
|
import
hashlib
m
=
hashlib.md5()
#创建一个MD5对象
m.update(b
"zhang"
)
#在python3中需要是2进制的值,所以字符串前加b
print
(m.hexdigest())
#以16进制打印MD5值
#输出
d0cd2693b3506677e4c55e91d6365bff
m.update(b
"qigao"
)
print
(m.hexdigest())
#输出
0bfca190ecc60e44cbc739ca9c252133
|
2、文件内容MD5值
说明:如果我们想得到一个文件所有内容的MD5值,我们所做的方法是循环这个文件,获取每行的MD5值,但是这样生成的MD5值的效率会变慢,因为每一行都需要计算。这样我们还不如直接把文件的所有内容加载出来,直接计算它的MD5值,这样反而快些。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import
hashlib
m
=
hashlib.md5()
#创建MD5对象m
m.update(b
"zhang"
)
print
(m.hexdigest())
#输出
d0cd2693b3506677e4c55e91d6365bff
m.update(b
"qigao"
)
print
(m.hexdigest())
#输出
0bfca190ecc60e44cbc739ca9c252133
m2
=
hashlib.md5()
#创建MD5对象m2
m2.update(b
"zhangqigao"
)
print
(m2.hexdigest())
#输出
0bfca190ecc60e44cbc739ca9c252133
|
注:由上面的代码可以看出,你读到最后一行的字符串的MD5值跟一下子读取所有内容的MD5值是一样的,这是为什么呢?其实这边update做了一个拼接功能,m.update(b"zhang")是返回的字符串"zhang"的MD5值,但是到了第二个m.update("qigao")的值并不是"qigao"的字符串的MD5值,它需要拼接前面的字符串,应该是m.update(b"zhangqigao")的MD5值,所以相当于m.update(b"zhang"),m.update(b"qigao") = m.update(b"zhang"+b"qigao")。
三、sha1加密
1
2
3
4
5
6
7
8
|
import
hashlib
hash
=
hashlib.sha1()
hash
.update(b
"zhangqigao"
)
print
(
hash
.hexdigest())
#输出
c8b2a6571067f92133b5b43a085f1ddd36e8c3fb
|
四、sha256加密
说明:sha256用的比较多,相比MD5要更加的安全
1
2
3
4
5
6
7
8
|
import
hashlib
hash
=
hashlib.sha256()
hash
.update(b
"zhangqigao"
)
print
(
hash
.hexdigest())
#输出
0634de5fe3d009fd0ec76ab3d97ab0fe37969b696e8d6550797cf3b446dd78ba
|
五、sha384加密
1
2
3
4
5
6
7
8
|
import
hashlib
hash
=
hashlib.sha384()
hash
.update(b
"zhangqigao"
)
print
(
hash
.hexdigest())
#输出
3489c64e31671094ca1afde35fd31ee9b09cdb90c3728f31696829e8a56be311e1405d537179e62d236e6d70a4f13ff4
|
六、sha512加密
1
2
3
4
5
6
7
8
|
import
hashlib
hash
=
hashlib.sha512()
hash
.update(b
"zhangqigao"
)
print
(
hash
.hexdigest())
#输出
cb09fd5a519b2b075f4aa5965a39657df900fff832b73d161a426512b6023ab8c1c0872a7b2d50055cbd75c4b6f374cda0615be9530f7f4b7dc08ab3f266325d
|
注意:
- 以上这几种,其实都是对MD5加密的不同算法
- 其中sha256用的最多,比MD5要安全的多
- 有些公司会用加盐方式加密,比如:把字符串"zhangqigao",通过一定的算法变成"zhang.qi.gao",当然这种算法自己肯定要知道,然后MD5加密,当然每个公司的加盐方式是不一样的。
七、hmac加密
其实以上还不是最牛的,最牛的是下面这种,叫hmac加密,它内部是对我们创建key和内容进行处理再进行加密。
散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(Message Authentication Code)的鉴别机制。使用HMAC时,消息通讯的双方,通过验证消息中加入的鉴别密钥K来鉴别消息的真伪;
一般用于网络通信中消息加密,前提是双方先要约定好key,就像接头暗号一样,然后消息发送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。
代码如下:
1
2
3
4
5
6
7
|
import
hmac
#导入hmac模块
hash
=
hmac.new(b
"zhang"
,b
"qigao"
)
#zhang是key,qigao是内容
print
(
hash
.hexdigest())
#输出
2f124c86aeb5142246198f77a142e855
|