在Python 3应用程序中,我需要使用自己的密码加密用户的数据。 我正在使用Cryptodome库。
鉴于AES需要固定大小的密钥(在示例中为128位),我使用PBKDF2来获取密钥。 下面是我在代码中使用的类。
我将用于密钥派生的salt( salt )存储在消息本身顶部,并将初始化向量(代码中的 iv )存储在消息本身的顶部。 实际上,根据我的理解(阅读文档here),盐和静脉注射都不能保密。
这是一种正确的方法,还是可以建议我一个更好的方法?
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Protocol import KDF
class crypto:
def __init__(self,pwd):
self.pwd = pwd
def encrypt(self,data):
salt = get_random_bytes(8)
key = KDF.PBKDF2(self.pwd,salt) #128bit key derivation function
iv = get_random_bytes(16)
cipher = AES.new(key, AES.MODE_CFB, iv)
return salt + iv + cipher.encrypt(data)
def decrypt(self,msg):
key = KDF.PBKDF2(self.pwd,msg[:8])
cipher = AES.new(key, AES.MODE_CFB, msg[8:24])
return cipher.decrypt(msg[24:])
提前致谢。
答案 0 :(得分:1)
是的,这是正确的,是一种很好的做法,也是为解密代码提供派生盐和iv的好方法。
PBKDF提供大量安全措施来防止暴力密码攻击以及正确的长度密钥。