字符串如何构造哈希_术业有专攻:安全哈希模块hashlib

本文约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

(完)

0dcaf6d4766efafcff1bd8ba19311088.png

欢迎关注【lambda派】!

相关阅读:

术业有专攻:ZIP文件操作模块zipfile

术业有专攻:I/O流操作模块io

术业有专攻:逗号分割文件csv

术业有专攻:高阶函数模块functools

术业有专攻:数学计算模块math

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值