python中的加密工具


你说得对,之前的介绍可能过于简略了。让我们更详细地探讨 AESRSASHA-256盐值哈希Fernet 每种方法的常见函数、参数以及应用场景。我会补充更多关于这些方法的用法、函数介绍和细节,以帮助你更深入理解。

1. AES(对称加密)

主要函数和方法:

  • AES.new(key, mode, iv=None, counter=None, segment_size=None):创建一个 AES 加密器。 key:加密密钥,长度一般为 16、24 或 32 字节,分别对应 AES-128、AES-192、AES-256。 mode:加密模式,例如 AES.MODE_ECB(电子代码簿模式)、AES.MODE_CBC(密码分组链接模式)、AES.MODE_CFB(密码反馈模式)等。 iv:初始化向量(仅在某些模式下需要,如 CBC)。 counter:计数器,适用于 CTR 模式。 segment_size:用于 GCM 或其他模式时指定块大小。
  • cipher.encrypt(data):对数据进行加密。
  • cipher.decrypt(data):对数据进行解密。
  • AES.block_size:AES 模式下的块大小(通常为 16 字节)。

完整示例:AES 加密和解密(CBC 模式)

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64

# 生成一个 128 位的随机密钥
key = get_random_bytes(16)

# 初始化 AES 加密器,使用 CBC 模式
cipher = AES.new(key, AES.MODE_CBC)

# 要加密的数据
data = "This is a secret message".encode('utf-8')

# 填充数据,使其长度为16的倍数
pad_length = 16 - (len(data) % 16)
data += bytes([pad_length]) * pad_length

# 加密
encrypted_data = cipher.encrypt(data)

# 输出加密后的数据(base64 编码)
print("Encrypted:", base64.b64encode(encrypted_data).decode())

# 解密
cipher_dec = AES.new(key, AES.MODE_CBC, cipher.iv)
decrypted_data = cipher_dec.decrypt(encrypted_data)

# 去除填充
decrypted_data = decrypted_data[:-decrypted_data[-1]].decode('utf-8')

print("Decrypted:", decrypted_data)

解释:

  • AES.MODE_CBC:使用 CBC(密码分组链接模式)来加密数据。
  • 填充:AES 的块大小为 16 字节,必须填充数据的长度,使其成为 16 的倍数。
  • 解密时,需要使用相同的 iv(初始化向量)。


2. RSA(非对称加密)

主要函数和方法:

  • rsa.generate_private_key(public_exponent, key_size):生成 RSA 私钥,public_exponent 通常为 65537,key_size 为密钥长度,通常为 2048 或 4096 位。
  • private_key.public_key():从私钥中提取公钥。
  • public_key.encrypt(data, padding):使用公钥加密数据,padding 通常使用 OAEP 填充模式(推荐)。
  • private_key.decrypt(data, padding):使用私钥解密数据。
  • public_key.encrypt(data, padding):使用公钥加密数据。

完整示例:RSA 加密和解密

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding

# 生成 RSA 密钥对(私钥、公钥)
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)

public_key = private_key.public_key()

# 加密数据
message = b"Encrypt this message"
ciphertext = public_key.encrypt(
    message,
    padding.OAEP(
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 解密数据
original_message = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("Original Message:", original_message.decode())

解释:

  • RSA:加密数据时,使用公钥;解密时,使用私钥。
  • OAEP 填充:一种加密填充方案,能提供较好的安全性。
  • key_size=2048:推荐使用 2048 位以上的密钥。


3. SHA-256(哈希算法)

主要函数和方法:

  • hashlib.sha256():创建一个 SHA-256 哈希对象。
  • hash_object.update(data):更新哈希对象,data 必须是字节格式。
  • hash_object.hexdigest():返回哈希值的十六进制字符串。

完整示例:SHA-256 哈希

import hashlib

# 创建 SHA-256 哈希对象
hash_object = hashlib.sha256()

# 更新哈希对象(必须是字节数据)
hash_object.update(b"This is a message")

# 获取哈希值
hashed_data = hash_object.hexdigest()

print("SHA-256 Hash:", hashed_data)

解释:

  • hashlib.sha256():用于创建 SHA-256 哈希对象。
  • update():可以多次调用,向哈希对象传入字节数据进行更新。
  • hexdigest():获取最终的哈希值,并返回十六进制表示。


4. 盐值哈希(加盐)

主要函数和方法:

  • os.urandom(size):生成随机盐值,size 指定盐值的字节长度。
  • hashlib.sha256(data):对包含盐值和原始数据的组合进行哈希处理。

完整示例:盐值哈希

import hashlib
import os

# 生成一个16字节长度的随机盐值
salt = os.urandom(16)

# 原始密码
password = b"my_secure_password"

# 将盐与密码拼接
password_salt = salt + password

# 使用 SHA-256 生成哈希
hashed_password = hashlib.sha256(password_salt).hexdigest()

print("Hashed password with salt:", hashed_password)

解释:

  • os.urandom(16):生成 16 字节的随机盐值,确保每次生成的哈希值都不同。
  • 盐值作用:将盐值与原密码拼接后进行哈希,防止了不同用户使用相同密码时产生相同的哈希值。


5. Fernet(对称加密)

主要函数和方法:

  • Fernet.generate_key():生成密钥。
  • Fernet(key):使用密钥初始化 Fernet 加密器。
  • cipher.encrypt(data):加密数据,返回加密后的数据。
  • cipher.decrypt(data):解密数据,返回解密后的数据。

完整示例:Fernet 加密和解密

from cryptography.fernet import Fernet

# 生成密钥
key = Fernet.generate_key()

# 创建 Fernet 加密器
cipher = Fernet(key)

# 加密数据
message = b"Confidential message"
encrypted_message = cipher.encrypt(message)
print("Encrypted:", encrypted_message)

# 解密数据
decrypted_message = cipher.decrypt(encrypted_message)
print("Decrypted:", decrypted_message.decode())

解释:

  • Fernet:基于 AES 加密和 HMAC,保证消息的机密性和完整性。生成的密钥必须保密。
  • generate_key():用于生成一个新的密钥,确保每个加密操作都能使用唯一的密钥。
  • encrypt() 和 decrypt():分别用于加密和解密数据。


总结:

加密方式主要函数说明
AESAES.new()cipher.encrypt()cipher.decrypt()对称加密,使用相同的密钥加解密。
RSArsa.generate_private_key()public_key.encrypt()private_key.decrypt()非对称加密,公钥加密,私钥解密。
SHA-256hashlib.sha256()hash_object.update()hash_object.hexdigest()哈希算法,单向不可解密。
盐值哈希os.urandom()hashlib.sha256()哈希加盐,增强密码存储安全性


文章标签:

评论(0)