本文约1750字,建议阅读时间8~10分钟
关键字:python,哈希散列,数据加密,hashlib
hashlib模块提供了许多不同的安全哈希(散列)和信息摘要算法,包括FIPS(美国联邦信息处理标准)的安全哈希算法SHA1、 SHA224,、SHA256,、SHA384、SHA512和RSA的MD5算法。较早的算法被称为信息摘要,现在则称为安全哈希。安全哈希算法主要用于加密和数字签名。
1、哈希算法对象的生成
(1)特定哈希算法构造器
python中的哈希算法首先生成相应算法如sha1()的构造器,然后通过该对象的update()方法对字节对象进行哈希计算,并可通过digest()或者hexdigest()方法来获取相应的数据串摘要。
import hashlib
encipher=hashlib.sha256()
data=b'This is the corpus of family name.'
encipher.update(data)
encipher.digest()
#返回:
b"\xde\x1d\x8bR>\x8e\x8e\x00\xc63\x9cA\x9a\x93\xb4\x8cg\xaa\x06'\xc9!$R\xf1\xb1k\xf5\xdcF\x89\xbd"
encipher.hexdigest()
#返回:
‘de1d8b523e8e8e00c6339c419a93b48c67aa0627c9212452f1b16bf5dc4689bd’
(2)公共哈希算法构造器
encipher_new=hashlib.new(name='ripemd160',data=data)
#name为OpenSSL(计算机网络上是一个开放源代码的软件库包)提供的算法名称
#data为待哈希的字节串,且可省略,省略时,仍可通过构造器调用update(data)方法
encipher_new.digest()
#返回b"'R~\xad\xd0\xe8\x0cb\xaaE;\xa1\x14\xd7\xa9\x1d\x9f\x91z\xd9"
encipher_new.hexdigest()
#返回’27527eadd0e80c62aa453ba114d7a91d9f917ad9’
2、相关属性
(1)hash算法的名称集合
hashlib.algorithms_guaranteed
#返回如下:
{'sha3_512', 'shake_128', 'sha384', 'sha3_256', 'sha256', 'blake2b', 'md5', 'sha1', 'sha512', 'sha3_224', 'sha3_384', 'shake_256', 'blake2s', 'sha224'}
(2)python可用的hash算法名称集合
hashlib.algorithms_available
#返回如下:
{'DSA-SHA', 'SHA1', 'ripemd160', 'sha224', 'md5', 'SHA256',……}
#注:返回的这些方法名称可以作为算法构造器new方法中的name参数
(3)hash算法对象的属性
hash对象字节大小
encipher_new.digest_size
#返回20
hash算法字节块大小
encipher_new.block_size
#返回64
hash算法名称
encipher_new.name
#返回ripemd160
3、hash对象的方法
(1)hash对象的更新
encipher_n=hashlib.new(name='md5')
encipher_n.update(data)
#注:连续执行encipher.update(a)和encipher.update(b)与encipher.update(a+b)结果一致
(2)当前update方法更新的数据摘要
encipher_n.digest()
#返回如下:
b'n\x08\xbeL\x9cP[\xc4\x0f\x101\xa9\x9c /t'
(3)当前update方法更新的数据摘要十六进制字符串
encipher_n.hexdigest()
#返回如下:
‘6e08be4c9c505bc40f1031a99c202f74’
(4)hash对象的复制
encipher_n.copy()
#返回如下:
#对于计算共享部分初始化子串的数据非常有用
4、SHAKE算法的可变长度摘要
encipher_shake=hashlib.new(name='shake_128',data=data)
encipher_shake.digest(10)
#返回b'^\xfd\x02?Vh\xfe\x0fu\xa2'
encipher_shake.hexdigest(10)
#返回’5efd023f5668fe0f75a2’
5、密钥导出
(1)PKCS#5基于密码的密钥导出
dk=pbkdf2_hmac(hash_name='sha256',password=b'great',salt=b'salt',iterations=100000)
#hash_name为HMAC算法的名称,如’sha1’或’sha256’;
#password为密码字节串,长度应不超过1024;
#salt为16或更多字节的合法串,可通过os.urandom(n)生成;
#iterations为基于hash算法和算力的迭代次数,对于sha256算法建议100000;
dk.hex()
#返回如下:
‘a0e8bae491bb4af87777cdbc4995f255fdca444e9add01c7776d7ceac0477224’
(2)scrypt基于密码的密钥导出
dk=scrypt(password=b'great',salt=b'salt',n=2,r=2,p=2)
#password为密码字节串,长度应不超过1024;
#salt为16或更多字节的合法串;
#n、r、p分别为CPU/内存代价因子、块大小因子一级并行度因子
dk.hex()
#返回如下:
'08d74d3d307c7a486bd206840a39410fdc4e4c753d96beb90c3dcd7fd08a3ab2eacb178070ae2347a3c7ffe65d7246eb1e1402d6fcc44fe107b36249d7a172e4'
6、BLAKE2
BLAKE2是目前安全性较高的哈希函数,主要有两种:一是适用64位平台且产生1到64字节摘要的BLAKE2b,二是适用8到32位平台且产生1到32字节摘要的BLAKE2s。
(1)创建hash对象
encipher_blake2b=hashlib.blake2b(data,digest_size=64,key=b'',salt=b'',person=b'',fanout=1,depth=1,leaf_size=0,node_offset=0,node_depth=0,inner_size=0,last_node=False)
#data为待hash的字节对象,且只接受位置参数形式;
#digest_size为输出摘要的大小;
#key为密钥hash的密钥,64字节;
#salt为随机散列的系统“调剂”,16字节;
#person为个性化字符串,16字节;
#余下参数为哈希树对应的参数,可选;
encipher_blake2b.hexdigest()
#返回如下:
'863b10156a6c6bde52f7547b704afd0e9d4800906903b3a20881fd72c30b458c22c666c871fac8577713bec266df76a065b9a0ba911d812ee2737553bb717fd2'
encipher_blake2s=hashlib.blake2s(data,digest_size=32,key=b'',salt=b'',person=b'',fanout=1,depth=1,leaf_size=0,node_offset=0,node_depth=0,inner_size=0,last_node=False)
#data为待hash的字节对象,且只接受位置参数形式;
#digest_size为输出摘要的大小;
#key为密钥hash的密钥,32字节;
#salt为随机散列的系统“调剂”,8字节;
#person为个性化串,8字节;
#余下参数为哈希树对应的参数,可选;
encipher_blake2s.hexdigest()
#返回如下:
'78de61dd1aa97dd46e0d3fb21165b1d8a45103653cfd04c31f597b7815f0da5d'
注:不同的digest_size会生成不同的hash长度,并且较短的结果并不是较长结果的一部分。此外,即使digest_size相同,但blake2b方法和blake2s方法得到的结果也不一样。
(2)相关常数
salt的最大长度
blake2b.SALT_SIZE
blake2s.SALT_SIZE
个性化串的最大长度
blake2b.PERSON_SIZE
blake2s.PERSON_SIZE
密钥最大长度
blake2b.MAX_KEY_SIZE
blake2s.MAX_KEY_SIZE
摘要的最大长度
blake2b.MAX_DIGEST_SIZE
blake2s.MAX_DIGEST_SIZE
(完)
欢迎关注【lambda派】!
相关阅读:
术业有专攻:ZIP文件操作模块zipfile
术业有专攻:I/O流操作模块io
术业有专攻:逗号分割文件csv
术业有专攻:高阶函数模块functools
术业有专攻:数学计算模块math