python模块hashlib(加密服务)知识点讲解
官方文案:https://docs.python.org/zh-cn/3/library/hashlib.html
hashlib---安全哈希与消息摘要
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要digestalgorithms算法呢?摘要算法又称哈希hash算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
hash算法
每种类型的hash都有一个构建器方法,返回一个hash对象和相同的简单接口。
例如:
使用sha256()创建一个SHA-256hashobject。可以使用update()喂给它bytes-likeobject。然后可以用digest()或hexdigest()来获得数据的摘要。
hashlib模型有许多算法如:sha1(),sha224(),sha256(),sha384(),sha512(),blake2b(),andblake2s()。还有很多其他算法要看Python使用的OpenSSLlibary。具体见文档。
使用algorithms_guaranteed常量,查看模块在所有平台都支持的算法:
>>>hashlib.algorithms_guaranteed {'blake2s','sha256','sha3_512','sha1','shake_128','sha3_256','sha3_384','blake2b','sha3_224','sha512','md5','shake_256','sha224','sha384'}
使用algorithms_available常量,在编译器运行时可以的hash算法
>>>hashlib.algorithms_available {'sha3_256','blake2b','md5','sha512_224','sha384','md4','sha256','sha512','whirlpool','sha224','sha512_256','shake_128','sha3_384','ripemd160','blake2s','sha3_512','sha1','sm3','shake_256','sha3_224','md5-sha1'}
例子:
>>>importhashlib >>>m=hashlib.sha256() >>>m.update(b"thespammishrepetition")#重复调用相当于,把bytes字节串相加。 >>>m.name#hash算法的名字 'sha256' >>>m.digest()#返回传入update()的数据的摘要 b'U<\x9bP\xb1\xa8\x9a\x9aE\x0f;h\xdb\x04\x11\xc1\x08\xfaH\xa7\t\xbfF\x91\x01\x13\xa1\x87\xb6\xd9`\x96' >>>m.digest_size#摘要的大小 >>>m.block_size#hash算法内的块的大小 >>>m.hexdigest()#返回一个字符串对象,一般用在安全的email或其他非binary环境 '553c9b50b1a89a9a450f3b68db0411c108fa48a709bf46910113a187b6d96096' >>>
不同的算法安全不一样,sha256就比sha1安全,但越安全的算法不仅越慢,摘要长度更长。
摘要算法应用
保存用户输入的密码:正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5.
摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。
例子:
存储MD5的好处是即使运维人员能访问数据库,也无法获知用户的明文口令。
设计一个验证用户登录的函数,根据用户输入的口令是否正确,返回True或False:
#-*-coding:utf-8-*- db={ 'michael':'e10adc3949ba59abbe56e057f20f883e', 'bob':'878ef96e86145580c38c87f0410ad153', 'alice':'99b1c2188db85afee403b1536010c2c9' } importhashlib defcalc_md5(password): m=hashlib.md5() m.update(password.encode('utf-8')) returnm.hexdigest() deflogin(user,password): returndb[user]==calc_md5(password) #测试: assertlogin('michael','123456') assertlogin('bob','abc999') assertlogin('alice','alice2008') assertnotlogin('michael','1234567') assertnotlogin('bob','123456') assertnotlogin('alice','Alice2008') print('ok')
希望毛票票整理的相关知识点能够帮助到大家,感谢你们的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。