python常用模块之hashlib模块

hashlib模块

摘要算法简介

  摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

  摘要算法一般应用在验证数据的完整性。举个例子,网络传输如何验证接受到的数据是否正确,这时候就可以就可以对接收到的文件做摘要算法,得到的摘要(digest)不正确则说明文件有缺失。摘要算法能够验证数据完整性的原因便是它是一个单向函数,它只能通过f(data)正向计算出摘要,反向破解则非常非常困难,而且data即使有一个bit的字节错误,也会计算出两个完全不同的结果。因为这个特性,摘要算法也常被应用在对用户密码进行哈希后传输和保存到数据库。

  摘要算法一般有这几类:  

  1. MD(Message Digest):消息摘要

  2. SHA(Secure Hash Algorithm):安全散列

  3. MAC(Message Authentication Code):消息认证码

hashlib模块算法

  python的hashlib模块提供了常用的哈希算法,如md5,SHA系列的算法等等。mac算法(加了秘钥的md和sha算法),在另一个模块hmac里面。

  md5和sha创建的hash对象拥有以下相同的方法:

hash.update(data):

  参数: data要是一个字节对象(bytes-like object)

  功能: 更新hash对象的计算结果,当数据特别大时可以分开计算,即update(a+b) = update(a)+ update(b)

hash.digest():

  功能: 返回hash后的计算结果, 表现形式是字节

hash.hexdigest():

  功能: 返回hash后结果的十六进制表示形式

hash.copy():

  功能:复制一个hash对象

md5:

  MD5是最常见的摘要算法,计算速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。

>>> import hashlib
>>> m = hashlib.md5() >>> m.update(b'hello') # 后面必须跟字节对象 >>> m.hexdigest() '5d41402abc4b2a76b9719d911017c592' >>> m.update(b'world') >>> m.hexdigest() 'fc5e038d38a57032085441e7fe7010b0' >>> m2 = hashlib.md5() >>> m2.update(b'helloworld') # 验证分开后和一起计算的结果显示相同 >>> m2.hexdigest() 'fc5e038d38a57032085441e7fe7010b0' >>> m.digest() # 输出字节形式 b'\xfc^\x03\x8d8\xa5p2\x08TA\xe7\xfep\x10\xb0'

 SHA:

  包括SHA1, SHA224, SHA256, SHA384, SHA512。

  常用的方法是SHA1算法,用法与MD5一模一样,SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法不仅越慢,而且摘要长度更长。

>>> sha1 = hashlib.sha1()
>>> sha1.update(b'hello')
>>> sha1.hexdigest()
'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d'
>>> sha1.update(b'world')
>>> sha1.hexdigest()
'6adfb183a4a2c94a2f92dab5ade762a47889a5a1'
>>> sha224 = hashlib.sha224()
>>> sha224.update(b'helloworld')
>>> sha224.hexdigest()
'b033d770602994efa135c5248af300d81567ad5b59cec4bccbf15bcc'

加盐:

  由于md5等算法不是绝对安全的,例如用户设置的密码过于简单,黑客可以通过准备的密码和md5对应的字典列表,直接反破解密码。因此加盐是一种很好的预防手段,即在常用的口令前加一个复杂字符串一起计算md5值。

>>> m1 = hashlib.md5()
>>> m1.update(b'123456')
>>> m1.hexdigest()
'e10adc3949ba59abbe56e057f20f883e'
>>> 
>>> m2 = hashlib.md5(('123456' + 'salt').encode('utf8'))
>>> m2.hexdigest()
'207acd61a3c1bd506d7e9a4535359f8a'

  上面的salt字符串可以自己自由设计算法生成,例如用户名+密码或用户名的奇数位等等。

小结:

  摘要算法在很多地方都有广泛的应用。但是摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。作为用户也不能无条件的相信md5等算法,因为黑客可以通过撞库(撞库是黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登录的用户。)登录,即自己不能设置太简单的密码,也不能在所有网站都使用相同的网站,毕竟黑客破不开淘宝腾讯等大公司的服务器,但是小公司的服务器他们是有可能破开的,所以安全问题自己也得上心。

 

posted @ 2018-11-29 16:14  yscl  阅读(117)  评论(0)    收藏  举报