写在篇前
哈希加密算法应用非常广泛,包括数字签名,身份验证,操作检测,指纹,校验和(消息完整性检查),哈希表,密码存储等。在密码学中,好的哈希算法应该满足以下两个条件:一是无法从哈希值解密原始消息;二是,更改原始消息的一个字节,哈希消息会发生非常大的变化。
哈希函数以可变长度的字节序列的作为输入,并将其转换为固定长度的序列。这个过程是单向的,即意味着,如果f
是哈希函数,则f(x)
的计算相当简单快捷,但是如果尝试从f(x)
获得x
则可能需要数年时间。哈希函数返回的值通常称为secure hash(安全哈希),message digest(消息摘要)或 checksum(校验和)。大多数情况下,哈希函数会为给定的输入产生唯一的输出。但是有的哈希算法有可能会发生哈希碰撞。
基本使用
hashlib
标准库提供了两个常量属性algorithms_available
和algorithms_guaranteed
,前者表示当前python解释器支持的hash算法名称(包括openssl提供的hash算法);后者表示该标准库稳定支持的hash算法,如下所示:
>>> print(hashlib.algorithms_available)
{
'sha224', 'sha512-224', 'md4', 'sha3_224', 'sha512-256', 'whirlpool', 'blake2b', 'sha3_512', 'sha3_384', 'md5-sha1', 'sha1', 'sha384', 'sha3_256', 'sha3-384', 'sha256', 'shake_256', 'shake_128', 'sha3-224', 'sm3', 'blake2s256', 'sha3-256', 'ripemd160', 'shake256', 'shake128', 'sha512', 'blake2s', 'mdc2', 'md5', 'blake2b512', 'sha3-512'}
>