hashlib模块

Posted xulan0922

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hashlib模块相关的知识,希望对你有一定的参考价值。

hashlib模块用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

注意:md5和sha256算法都是单向加密,即明文加密为密文后,密文无法再解密回明文

适合应用场景:用户的密码需要加密后才能入库

import hashlib
m = hashlib.md5()                      #使用md5算法,没有加盐;如果是sha256算法:hashlib.sha256()
m.update(hello.encode(utf8))       #对‘hello‘加密
print(m.hexdigest())                   #打印加密后的密文

m1 = hashlib.md5()
m1.update(hello.encode(utf8))
print(m1.hexdigest())
结果:

5d41402abc4b2a76b9719d911017c592
5d41402abc4b2a76b9719d911017c592

可见,通过这种方式,一个不定长的字符串可以加密变为一个定长的密文,而这个明文和密文永远是一一对应的关系,即‘hello‘通过md5加密后的密文一定是5d41402abc4b2a76b9719d911017c592

有人把这种一一对应的关系收集记录(特别是常用的字符串),放入一个数据库,通过撞库就可以解密MD5,比如我们常用的https://www.cmd5.com/

技术分享图片

所以有必要对加密算法中添加自定义key再来做加密,即加盐

m = hashlib.md5(nba.encode(utf8))     #‘nba‘就是加盐,没有加盐的时候hashlib.md5()方法不带参数
m.update(hello.encode(utf8))
print(m.hexdigest())
结果:444d0cc8a2d942f881bc85f5a31eced0

用上面这个密文结果去https://www.cmd5.com/解密是无法得到明文的

技术分享图片

 需要注意的是,同一个hashlib对象的加密是连续叠加的:

m = hashlib.md5()
m.update(hello.encode(utf8))      #m对象先对‘hello‘加密
print(m.hexdigest())                  #这个密文是‘hello‘的
m.update(nick.encode(utf8))       #m对象再对‘nick‘加密
print(m.hexdigest())                  #这个密文不是‘nick‘的,而是‘hellonick‘的

m2 = hashlib.md5()
m2.update(hellonick.encode(utf8))
print(m2.hexdigest())
结果:

5d41402abc4b2a76b9719d911017c592
d29690d65b7fdc3308b016f7a26cde94
d29690d65b7fdc3308b016f7a26cde94

 

以上是关于hashlib模块的主要内容,如果未能解决你的问题,请参考以下文章

hash模块 hashlib 和hmac

Python中hashlib模块

包logging模块hashlib模块openpyxl模块深浅拷贝

包/logging模块/hashlib模块/openpyxl模块/深浅拷贝

第三十六篇 hashlib模块hmac模块和logging模块

包,logging模块,hashlib模块,openpyxl模块,深拷贝,浅拷贝