您所做的是以下内容:
- 生成长密钥(这只是一个安全的随机生成量数据,可以使用128位)
- 您使用此密钥使用 AES 加密您的文件(这意味着您将其用作密码)
- 您使用密码使用 AES 加密密钥本身(这有点短但更容易记住。现在 AES 再次要求它的长度为 128、192 或 256 位,因此您需要设置该长度的密码。因此,您可以只使用 PBKDF2(或 scrypt 或 bcrypt)从您的密码创建一个固定长度的密钥。 不要存储这个。
- 您使用 PBKDF2(或 bcrypt 或 scrypt)保留哈希密码的哈希值。这将允许您在尝试解密加密密钥之前检查密码是否正确。
所以:
hash(hash(password)) --> can be stored
hash(password) --> cannot be stored
即使您只有一个键,您也总是需要提供盐(这在很大程度上防止了彩虹表查找)。幸运的是,盐的生成是由 PBKDF2 自动完成的。
所以最后你实际上有3件事:
您可能会问为什么需要密钥:如果您要更改密码(并且您已使用密码加密了所有文件),您需要先使用原始密码解密所有文件,然后使用新密码重新加密它们密码。使用此实现,您需要做的就是解密并重新加密密钥(因为此密钥用作您的密码)。
编辑
我有点误解了你的问题,我添加了密钥推导函数。
也是一本好书(IBM 提供)