Python的加密模块之hashlib 与 base64详解及常用加密方法

1. hashlib模块简介

哈希(hash)是一种将任意长度的消息压缩到某一固定长度的消息摘要(digest)的函数,哈希值是一段固定大小的字节数组。哈希函数可以是单向的或双向的,单向的哈希函数可以将任意长度的消息压缩到相同长度的哈希值,但无法从哈希值恢复出原来的消息。常用的哈希函数包括MD5和SHA系列。

2. hashlib常用方法

2.1 md5()方法

MD5是一种广泛使用的哈希函数,它能够将任意长度的消息压缩到128位的哈希值。Python中的hashlib模块提供了MD5哈希函数的实现,可以使用md5()方法计算一个字符串的MD5哈希值。

import hashlib

message = 'Hello, World!'

hash_value = hashlib.md5(message.encode())

print(hash_value.hexdigest())

上述代码中,首先导入了hashlib模块,然后定义了一个字符串message,使用encode()方法将其转换为字节串,接着调用md5()方法计算哈希值,使用hexdigest()方法将哈希值转换为十六进制字符串。

2.2 sha1()方法

SHA-1是一种安全性较高的哈希函数,它能够将任意长度的消息压缩到160位的哈希值。Python中的hashlib模块提供了SHA-1哈希函数的实现,可以使用sha1()方法计算一个字符串的SHA-1哈希值。

import hashlib

message = 'Hello, World!'

hash_value = hashlib.sha1(message.encode())

print(hash_value.hexdigest())

上述代码中,首先导入了hashlib模块,然后定义了一个字符串message,使用encode()方法将其转换为字节串,接着调用sha1()方法计算哈希值,使用hexdigest()方法将哈希值转换为十六进制字符串。

3. base64模块简介

Base64是一种将任意数据转换成可打印ASCII字符的编码方式,通常用于在不可靠的网络环境中传输数据。Base64编码后的数据比原数据略长,通常增加了33%的空间开销。Python中的base64模块提供了Base64编解码的实现,可以使用b64encode()方法对数据进行编码,使用b64decode()方法对数据进行解码。

4. 常用加密方法

4.1 密码加盐

密码加盐是一种常见的密码保护方式,它在密码中加入一个随机生成的字符串,使得相同的密码在不同的用户之间产生不同的哈希值,提高了密码的安全性。Python中可以使用os.urandom()函数生成随机的盐,将盐与密码进行拼接,然后使用哈希函数计算哈希值。

import os

import hashlib

def hash_password(password):

salt = os.urandom(16) # 生成16字节的随机盐

password = password.encode() # 将密码转换为字节串

hash_value = hashlib.sha256(salt + password).hexdigest() # 计算哈希值

return hash_value, salt

password = '123456'

hash_value, salt = hash_password(password)

print('hash value:', hash_value)

print('salt:', salt.hex())

上述代码中,首先导入了os和hashlib模块,然后定义了一个hash_password()函数,它使用os.urandom()函数生成随机的16字节盐,将盐和密码进行拼接,使用sha256()方法计算哈希值,返回哈希值和盐。接着定义了一个原始密码,调用hash_password()函数计算哈希值和盐,并分别打印哈希值和盐。

4.2 HMAC

HMAC(Hash-based Message Authentication Code)是一种基于哈希函数的消息认证码,它可以保证消息的完整性和真实性,防止数据被篡改或伪造。HMAC算法将消息和密钥进行拼接,并使用哈希函数计算哈希值,然后再将哈希值和密钥进行拼接,再使用哈希函数计算最终的哈希值。

import hashlib

import hmac

message = 'Hello, World!'

key = 'secret'

hash_value = hmac.new(key.encode(), message.encode(), hashlib.sha256).hexdigest()

print(hash_value)

上述代码中,首先导入了hashlib和hmac模块,然后定义了一个字符串message和一个密钥key,使用hmac.new()函数计算HMAC哈希值,并使用hexdigest()方法将哈希值转换为十六进制字符串。

4.3 RSA

RSA算法是一种非对称加密算法,它使用两个密钥:公钥和私钥。公钥可以公开,任何人都可以使用公钥加密数据,但只有私钥的持有人才能够解密数据。Python中可以使用rsa模块进行RSA加密和解密。

import rsa

message = b'Hello, World!'

(public_key, private_key) = rsa.newkeys(512) # 生成512位的公私钥对

encrypt_message = rsa.encrypt(message, public_key) # 使用公钥加密

decrypt_message = rsa.decrypt(encrypt_message, private_key) # 使用私钥解密

print('original message:', message)

print('encrypt message:', encrypt_message)

print('decrypt message:', decrypt_message)

上述代码中,首先导入了rsa模块,然后定义了一个字节串消息,使用rsa.newkeys()函数生成512位的公私钥对,使用rsa.encrypt()函数使用公钥加密消息,使用rsa.decrypt()函数使用私钥解密消息,并打印出原始消息、加密后的消息和解密后的消息。

4.4 AES

AES算法是一种对称加密算法,它需要使用一个密钥进行加密和解密,使用相同的密钥加密和解密。Python中可以使用pyaes模块进行AES加密和解密。

import pyaes

message = b'Hello, World!'

key = b'secretsecretsecr' # 密钥长度必须为16、24或32字节

encrypter = pyaes.AESModeOfOperationECB(key)

encrypt_message = encrypter.encrypt(message)

decrypt_message = encrypter.decrypt(encrypt_message)

print('original message:', message)

print('encrypt message:', encrypt_message)

print('decrypt message:', decrypt_message)

上述代码中,首先导入了pyaes模块,然后定义了一个字节串消息和一个密钥。使用pyaes.AESModeOfOperationECB()函数生成一个加密器,调用encrypt()方法使用密钥加密消息,调用decrypt()方法使用密钥解密消息,并打印出原始消息、加密后的消息和解密后的消息。

后端开发标签