hashlib模块

1. hashlib模块是什么

hashlib模块是Python标准库中一个用于实现加密哈希算法的模块,这些哈希算法包括MD5、SHA-1等。哈希算法是将任意长度的消息压缩成一个固定长度的消息摘要的函数。这个摘要是唯一的,即不会有两个不同的消息得到相同的摘要。哈希算法被广泛应用于数据完整性检查、数字签名、身份验证等安全领域。

2. hashlib模块常见类

2.1 hashlib.md5()

md5()类是将message以MD5算法的方式进行加密,并返回加密后的十六进制字符串。md5()类的用法如下:

import hashlib

message = 'hello, world!'

m = hashlib.md5()

m.update(message.encode('utf-8'))

print(m.hexdigest()) # 5eb63bbbe01eeed093cb22bb8f5acdc3

这个例子中,首先实例化了一个md5()对象m,然后使用update()方法对要加密的message进行更新,最后使用hexdigest()方法返回加密后的信息摘要。这个例子中输入的是一个字符串,需要注意在进行加密时需要先将字符串编码为bytes类型。

2.2 hashlib.sha1()

sha1()类是将message以SHA-1算法的方式进行加密,并返回加密后的十六进制字符串。sha1()类的用法与md5()类类似,只需要将类名改为sha1()即可。例如:

import hashlib

message = 'hello, world!'

s = hashlib.sha1()

s.update(message.encode('utf-8'))

print(s.hexdigest()) # 0a4d55a8d778e5022fab701977c5d840bbc486d0

2.3 hashlib.sha256()

sha256()类是将message以SHA-256算法的方式进行加密,并返回加密后的十六进制字符串。sha256()类的用法与md5()、sha1()类类似,只需要将类名改为sha256()即可。例如:

import hashlib

message = 'hello, world!'

s = hashlib.sha256()

s.update(message.encode('utf-8'))

print(s.hexdigest()) # d1e6f00acf8e550300c5caf5a994a4a9b6d26a97f469b3bc69fcd595e96a0f94

2.4 hashlib.sha512()

sha512()类是将message以SHA-512算法的方式进行加密,并返回加密后的十六进制字符串。sha512()类的用法与md5()、sha1()、sha256()类类似,只需要将类名改为sha512()即可。例如:

import hashlib

message = 'hello, world!'

s = hashlib.sha512()

s.update(message.encode('utf-8'))

print(s.hexdigest()) # cb4c46b24c9c95e6e9b2b9583b8f1c3741bf6bb88b42bf912b805e5b7a3c6b20636629fcabd3aeb2b3c0d48462c489cc92f2468b8c90c1a8a624a08167e57ad

3. hashlib模块其他方法

3.1 hashlib.new(algorithm)

new()方法用于创建一个新的hash对象。algorithm参数是一个字符串,代表要使用的加密算法。例如:

import hashlib

message = 'hello, world!'

h = hashlib.new('sha256', message.encode('utf-8'))

print(h.hexdigest()) # d1e6f00acf8e550300c5caf5a994a4a9b6d26a97f469b3bc69fcd595e96a0f94

这个例子中,首先使用new()方法创建了一个新的hash对象h,并指定使用的加密算法为SHA-256。然后使用update()方法对message进行更新,最后使用hexdigest()方法返回加密后的信息摘要。

3.2 hashlib.pbkdf2_hmac()

pbkdf2_hmac()方法是用于使用pbkdf2算法对password进行加密,并返回加密后的二进制字符串。pbkdf2算法是一种安全的密码哈希函数,可用于将密码存储在数据库中,以保护用户的密码。pbkdf2_hmac()方法的用法如下:

import hashlib

password = b'password123'

salt = b'abcdefg'

iterations = 10000

key_len = 32

key = hashlib.pbkdf2_hmac('sha256', password, salt, iterations, key_len)

print(key) # b'\x1b\x8c\xa4\x87\xb5U\xeceP1\xa4+6\x8a\xe6KCb\xb5\xcf\xd9 en?\xb9\x86Y\x01L\xcc'

这个例子中,使用pbkdf2_hmac()方法对password进行加密,并返回加密后的二进制字符串。其中,'sha256'参数指定了使用的加密算法为SHA-256,password、salt、iterations和key_len分别是要加密的密码、盐、迭代次数和密钥长度。

4. hashlib模块应用场景

4.1 数据完整性检查

哈希算法被广泛应用于数据完整性检查,例如在文件传输过程中,哈希算法可以用于校验文件是否被篡改。例如下面的代码:

import hashlib

def check_integrity(filename):

h = hashlib.sha256()

with open(filename, 'rb') as f:

while True:

chunk = f.read(4096)

if not chunk:

break

h.update(chunk)

return h.hexdigest()

if __name__ == '__main__':

filename = 'test.txt'

original_hash = 'c95b4627f7089389fbdcb542f6f3d947a5f182ab594e5756b2de53610dffe809'

if check_integrity(filename) == original_hash:

print('Integrity check passed.')

else:

print('Integrity check failed.')

这个例子中,首先使用sha256()算法创建了一个hash对象h。然后读取test.txt文件的内容,使用update()方法对这些内容进行更新,最后使用hexdigest()方法返回加密后的信息摘要。然后比较得到的信息摘要与原始的信息摘要是否相等,如果相等则说明文件未被篡改。

4.2 数字签名

数字签名是保证数据加密安全的一种重要方式,哈希算法可以用于数字签名中的数据摘要生成。例如下面的代码示例:

import hashlib

def sign_data(data, private_key):

h = hashlib.sha256()

h.update(data.encode('utf-8'))

digest = h.digest()

signature = private_key.sign(digest, hashlib.sha256)

return signature

if __name__ == '__main__':

data = 'hello, world!'

private_key = b'0123456789abcdef0123456789abcdef'

signature = sign_data(data, private_key)

print(signature)

这个例子中,首先使用sha256()算法创建了一个hash对象h。然后使用update()方法对要签名的数据进行更新。最后使用digest()方法返回加密后的信息摘要。然后使用私钥对信息摘要进行加密,以生成数字签名。

4.3 身份验证

哈希算法可以用于身份验证中的密码哈希,例如下面的代码示例:

import hashlib

def hash_password(password, salt):

h = hashlib.sha256()

h.update(password.encode('utf-8') + salt)

return h.hexdigest()

if __name__ == '__main__':

password = 'password123'

salt = b'abcdefg'

hashed_password = hash_password(password, salt)

print(hashed_password)

这个例子中,首先使用sha256()算法创建了一个hash对象h。然后使用update()方法对密码和盐进行更新。最后使用hexdigest()方法返回加密后的信息摘要。使用哈希后的密码(不是明文密码)进行身份验证更加安全。

后端开发标签