python hashlib模块--学习笔记
目录
简介:
Python内置的hashlib模块为我们提供了多种安全方便的摘要方法,如MD5,SHA1等,通俗的理解MD5算法,输入任意长度的数据,输出为固定长度的数据串(数字通常是16进制)很重要的一点
:哈希算法是一个单向函数,无法反推(但也不是绝对的)在大部分操作系统下,hashlib模块支持md5(),sha1(), sha224(), sha256(), sha384(), sha512(), blake2b(),blake2s(),sha3_224(), sha3_256(), sha3_384(), sha3_512(), shake_128(), shake_256()等多种hash构造方法。这些构造方法在使用上通用,返回带有同样接口的hash对象,对算法的选择,差别只在于构造方法的选择。例如sha1()能创建一个SHA-1对象,sha256()能创建一个SHA-256对象。然后就可以使用通用的update()方法将bytes类型的数据添加到对象里,最后通过digest()或者hexdigest()方法获得当前的摘要。
# This tuple and __get_builtin_constructor() must be modified if a new # always available algorithm is added. __always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'blake2b', 'blake2s', 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'shake_128', 'shake_256')
主要用途:
- 可以判断一段数据是否被篡改
- 用于网站登陆用户口令的存储
用于用户登陆口令存储
对于用户来说一般登陆网站或者应用都是有登陆账号和密码的.我们一般的做法都是会将这些口令数据映射起来存储到数据库中,用户登录需要使用密码,密码一定要加密,保证用户的信息安全。当用户登录时,首先计算用户输入的明文口令的摘要值,然后和数据库存储的摘要值进行对比。如果两者一致,说明口令输入正确,如果不一致,口令肯定错误。这样,不但数据库不用储存明文密码,即使能访问数据库的管理员“叛变”了,盗走了整个数据库,也无法获知用户的明文口令。
1)加密可以使用hashlib模块进行加密。
2)加密可以写成加密函数,方便多处调用
3)提高密码解密的复杂性,代码中多加字符串。(加密算法虽然依然非常厉害,但是也存在缺陷,即:通过撞库可以反解。所以,有必要对加密密码进行加盐。)
应用代码示例及原码学习
import hashlib
import os
password = "abcdefghijk".encode("utf-8")
salt = os.urandom(32)
print(salt)
# >>b']\xd6B6\x083\x81\xf6\x8a\t\xfb\x05\xcdDI\xbd\x84y>&\x80b\x9cg\xbfwT~\xa1\x84N\x9d'
md5 = hashlib.md5()
md5.update(password+salt)
print(md5.hexdigest())
# >>99edc107e9b480421d4ebd19f0f8b9bddef __hash_new(name, data=b'', **kwargs): """new(name, data=b'') - Return a new hashing object using the named algorithm; optionally initialized with data (which must be a bytes-like object). """ if name in {'blake2b', 'blake2s'}: # Prefer our blake2 implementation. # OpenSSL 1.1.0 comes with a limited implementation of blake2b/s. # It does neither support keyed blake2 nor advanced features like # salt, personal, tree hashing or SSE. return __get_builtin_constructor(name)(data, **kwargs) try: return _hashlib.new(name, data) except ValueError: # If the _hashlib module (OpenSSL) doesn't support the named # hash, try using our builtin implementations. # This allows for SHA224/256 and SHA384/512 support even though # the OpenSSL library prior to 0.9.8 doesn't provide them. return __get_builtin_constructor(name)(data)