问题现象描述
当开发者使用pycryptodome库的AES.new()方法时,经常会遇到ValueError: Incorrect AES key length错误。这个错误表明提供的加密密钥不符合AES算法的长度要求。典型的错误场景包括:
- 使用用户输入的原始密码直接作为密钥
- 从配置文件中读取的密钥字符串长度不正确
- 通过随机生成的字节序列长度不匹配
AES密钥长度要求
AES(高级加密标准)算法严格定义了三种可用的密钥长度:
| AES版本 | 密钥长度(位) | 密钥长度(字节) |
|---|---|---|
| AES-128 | 128 | 16 |
| AES-192 | 192 | 24 |
| AES-256 | 256 | 32 |
常见错误原因分析
导致密钥长度错误的典型原因包括:
- 字符串编码问题:直接将UTF-8编码的字符串作为密钥使用
- 哈希处理缺失:未对用户密码进行适当的哈希处理
- 截断错误:从数据库中读取密钥时被截断
- 配置错误:配置文件中的密钥长度不正确
解决方案
方案1:使用密钥派生函数
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Cipher import AES
import os
password = "mysecretpassword"
salt = os.urandom(16) # 生成随机盐值
key = PBKDF2(password, salt, dkLen=32) # 派生256位密钥
cipher = AES.new(key, AES.MODE_GCM)
方案2:填充或截断密钥
def adjust_key(key, target_length=32):
if len(key) > target_length:
return key[:target_length]
elif len(key) < target_length:
return key.ljust(target_length, b'\0')
return key
raw_key = b"my_raw_key_bytes"
adjusted_key = adjust_key(raw_key)
cipher = AES.new(adjusted_key, AES.MODE_CBC)
方案3:使用哈希函数处理
from hashlib import sha256
user_password = "user12345"
key = sha256(user_password.encode()).digest() # 生成256位哈希作为密钥
cipher = AES.new(key, AES.MODE_EAX)
最佳实践建议
- 始终使用密钥派生函数处理用户密码
- 为不同安全级别的数据选择适当的AES版本
- 结合盐值(salt)增加安全性
- 使用安全的随机数生成器创建密钥
- 定期轮换加密密钥
调试技巧
遇到密钥长度错误时,可以:
- 打印密钥长度:
print(len(key)) - 检查密钥类型:
print(type(key)) - 验证编码格式:
print(key.hex()) - 确认AES模式是否匹配
安全注意事项
处理加密密钥时应注意:
- 不要在日志中记录原始密钥
- 使用安全的内存管理技术处理密钥
- 实现密钥的妥善存储方案
- 遵循最小权限原则