python hashlib模块--学习笔记
目录
简介:
主要用途:
用于用户登陆口令存储
应用代码示例及原码学习
import hashlibimport ospassword = "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())# >>99edc107e9b480421d4ebd19f0f8b9bd
简介:
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()) # >>99edc107e9b480421d4ebd19f0f8b9bd
def __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)
|