使用 OpenSSL 和 Python 实现 AES-256-CBC 安全加密解密及密钥管理指南
环境
使用 OpenSSL 加密
1. 生成 AES 密钥和 IV
强烈推荐使用方法一(Python secrets
模块),因为它更安全。
方法一: Python 的 secrets
模块(安全方式)
不要使用 OpenSSL 的 rand
命令直接生成密钥和 IV 用于生产环境。 尽管 openssl rand
可以生成随机数,但它可能不符合密码学安全的要求。
推荐方法: 使用更安全的随机数生成器,例如 Python 的 secrets
模块:
import secrets
import binascii
# 生成 256 位 AES 密钥(32 字节)
key = secrets.token_bytes(32)
key_hex = binascii.hexlify(key).decode() # 转换为十六进制字符串
# 生成 128 位 IV(16 字节)
iv = secrets.token_bytes(16)
iv_hex = binascii.hexlify(iv).decode() # 转换为十六进制字符串
print("AES Key (Hex):", key_hex)
print("IV (Hex):", iv_hex)
secrets.token_bytes(nbytes)
: 生成 nbytes
个密码学安全的随机字节。
binascii.hexlify(data)
: 将字节数据转换为十六进制字符串。
保存: 将生成的密钥和 IV 安全地保存起来(例如,使用密码管理器)。
方法二: 直接使用 OpenSSL 的 rand
命令(不推荐)
openssl rand -hex 32 # 生成 256 位 AES 密钥(32 字节)
openssl rand -hex 16 # 生成 128 位 IV(16 字节)
openssl rand -hex <长度>
: 使用 OpenSSL 的随机数生成器生成指定长度的十六进制字符串。2. 加密
openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -in plaintext.txt -out ciphertext.bin -K $(cat key.txt) -iv $(cat iv.txt)
-pbkdf2
: 使用 PBKDF2 密钥派生函数。-iter 100000
: 设置迭代次数为 100000(建议至少 10000,可以根据需要调整)。-K $(cat key.txt)
: 从文件 key.txt
中读取 AES 密钥(假设你已将密钥保存在 key.txt
文件中)。-iv $(cat iv.txt)
: 从文件 iv.txt
中读取 IV(假设你已将 IV 保存在 iv.txt
文件中)。-salt
: 当使用-pbkdf2
的时候,不再需要-salt
。3. Base64 编码
将密文转换为文本格式(用于生成条形码),需要进行 Base64 编码:
openssl base64 -in ciphertext.bin -out ciphertext.txt
4. 生成条形码
https://barcode.tec-it.com/en
)将 Base64 编码后的密文生成条形码图片。安全传输密钥和密文
1. 安全传输密钥:
2. 发送条形码:
解密方式
1. 解密
openssl enc -d -aes-256-cbc -in ciphertext.bin -out plaintext.txt -K $(cat key.txt) -iv $(cat iv.txt) -pbkdf2 -iter 100000
-enc
改为 -d
(表示解密)。-pbkdf2
和 -iter
参数必须与加密时 完全一致。-K
和 -iv
参数仍然从文件中读取密钥和 IV。2. Base64 解码
openssl base64 -d -in ciphertext.txt -out ciphertext.bin
完整的流程总结
-
生成强密钥和 IV:
- 使用 Python 的
secrets
模块。 - 将密钥和 IV 保存到安全的文件中(例如,
key.txt
和iv.txt
), 或者密码管理器中。 -
加密:
openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -in plaintext.txt -out ciphertext.bin -K $(cat key.txt) -iv $(cat iv.txt)
openssl base64 -in ciphertext.bin -out ciphertext.txt
-
解密:
openssl enc -d -aes-256-cbc -in ciphertext.bin -out plaintext.txt -K $(cat key.txt) -iv $(cat iv.txt) -pbkdf2 -iter 100000
openssl base64 -d -in ciphertext.txt -out ciphertext.bin
注意安全, HAVE FUN! 👀
作者:dreadp