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()方法使用密钥解密消息,并打印出原始消息、加密后的消息和解密后的消息。