python基础——hashlib模块详解

一、hashlib

Hash,译做“散列”,也有直接音译为“哈希”的。把任意长度的输入,通过某种hash算法,变换成固定长度的输出,该输出就是散列值,也称摘要值。该算法就是哈希函数,也称摘要函数

MD5是最常见的摘要算法,速度很快,生成结果是固定的16字节,通常用一个32位的16进制字符串表示。
SHA1算法更安全点,它的结果是20字节长度,通常用一个40位的16进制字符串表示。
而比SHA1更安全的算法是SHA256和SHA512等等,不过越安全的算法越慢,并且摘要长度更长。

那么消息摘要有什么用呢?最常用的就是密码加密!密码加密不像数据加密,通常不需要反向解析出明文。

二、hashlib模块

Python内置的hashlib模块为我们提供了多种安全方便的摘要方法
hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法

这些构造方法在使用上通用,返回带有同样接口的hash对象,对算法的选择,差别只在于构造方法的选择。例如sha1()能创建一个SHA-1对象,sha256()能创建一个SHA-256对象。然后就可以使用通用的update()方法将bytes类型的数据添加到对象里,最后通过digest()或者hexdigest()方法获得当前的摘要。

(一)hash对象的方法

1.update()
更新要加密的参数,只接受bytes类型的数据,不接收str类型。由于消息摘要是只针对当前状态产生的,所以每一次update后,再次计算hexdigest()的值都会不一样。
注意:如果同一个hash对象重复调用该方法,则m.update(a); m.update(b) 等效于 m.update(a+b)


m1 = hashlib.md5()    # 构造hash对象 m1.update('hello'.encode('utf-8'))
m1.update(' '.encode('utf-8')) m1.update('python'.encode('utf-8')) m2
= hashlib.md5('hello python'.encode('utf-8')) print(m1.hexdigest()) print(m2.hexdigest())  # 两种方式的效果相同

# m1的加密结果: e53024684c9be1dd3f6114ecc8bbdddc
# m2的加密结果: e53024684c9be1dd3f6114ecc8bbdddc 

2.digest()
返回bytes格式的消息摘要
3.hexdigest()
与digest方法类似,不过返回的是两倍长度的字符串对象,所有的字符都是十六进制的数字。通常用于邮件传输或非二进制环境中。通常我们比较摘要时,比较的就是这个值!
4.copy()
返回一个hash对象的拷

(二)通用构造方法

hashlib.new(name[, data]),一个通用的构造方法,name是某个算法的字符串名称,data是可选的bytes类型待摘要的数据。

hash_sha256 = hashlib.new('sha256', b'hello word!')
print('加密的结果:', hash_sha256.hexdigest())
# 加密的结果: 4f96f25e83640c4560cc2c5c9d2bd9e22e2b43c2683e8005c1215d79536f8f0a

(三)普通加密

加密步骤:
1.建立加密对象。
2.对字符串进行算法加密。
3.获得16进制显示

例如,sha256的应用

ha_s256 = hashlib.sha256()
ha_s256.update('abc'.encode(encoding='utf-8'))  # update内必须是byte类型
print(ha_s256.digest())  # 以二进制格式显示加密信息
print(ha_s256.hexdigest())  # 以十六进制格式显示加密信息(常用)

注意,hashlib加密的数据类型为二进制编码(bytes类型)
直接加密字符串会报如下错误:
TypeError: Unicode-objects must be encoded before hashing

(四)高级加密

以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

low = hashlib.md5()
low.update('ab'.encode('utf-8'))
res = low.hexdigest()
print("普通加密:",res)

high = hashlib.md5(b'beyondjie')
high.update('ab'.encode('utf-8'))
res = high.hexdigest()
print("采用key加密:",res)

输出结果:
普通加密: 187ef4436122d1cc2f40dc2b92f0eba0
采用key加密: 1b073f6b8cffe609751e4c98537b7653

参考:
https://blog.csdn.net/ccblogger/article/details/79927173

你可能感兴趣的:(python基础,python)