python模块hashlib(加密服务)知识点讲解
官方文案:https://docs.python.org/zh-cn/3/library/hashlib.html
hashlib --- 安全哈希与消息摘要
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要digest algorithms算法呢?摘要算法又称哈希hash算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
hash算法
每种类型的hash都有一个构建器方法,返回一个hash对象和相同的简单接口。
例如:
使用sha256()创建一个SHA-256hash object。可以使用update()喂给它bytes-like object。然后可以用digest()或hexdigest()来获得数据的摘要。
hashlib模型有许多算法如:sha1(), sha224(), sha256(), sha384(), sha512(), blake2b(), and blake2s()。还有很多其他算法要看Python使用的OpenSSL libary。具体见文档。
使用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'}
例子:
>>> import hashlib >>> m = hashlib.sha256() >>> m.update(b" the spammish repetition") #重复调用相当于,把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' } import hashlib def calc_md5(password): m = hashlib.md5() m.update(password.encode('utf-8')) return m.hexdigest() def login(user, password): return db[user] == calc_md5(password) # 测试: assert login('michael', '123456') assert login('bob', 'abc999') assert login('alice', 'alice2008') assert not login('michael', '1234567') assert not login('bob', '123456') assert not login('alice', 'Alice2008') print('ok')
希望脚本之家整理的相关知识点能够帮助到大家,感谢你们的支持。
相关文章
Pytorch GPU显存充足却显示out of memory的解决方式
今天小编就为大家分享一篇Pytorch GPU显存充足却显示out of memory的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-01-01利用Python+Selenium破解春秋航空网滑块验证码的实战过程
本文给大家介绍使用Python+Selenium破解春秋航空网滑块验证码的实战过程,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2021-08-08Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
这篇文章主要介绍了Python中使用PyQt5/PySide2编写一个极简的音乐播放器功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2020-02-02
最新评论