我有一个网站,用户提交他们的个人数据,我正在考虑使用aes-256加密这些数据,他们的密码被用作加密的密钥,然后我将加密的数据存储在mysql数据库中...
现在,如果用户更改了密码,我将如何更改加密数据的密钥
我应该收集数据库中的所有数据,然后使用旧密钥解密数据,然后使用新密钥再次对其进行加密?
答案 0 :(得分:14)
更改密码时,无需重新加密所有用户的数据。
生成密钥以加密用户的数据;称之为“内容加密密钥”。从用户密码中导出密钥;称之为“密钥加密密钥”。使用“密钥加密密钥”加密“内容加密密钥”。存储加密密钥以及salt和用于密钥派生的迭代次数。
如果他们更改了密码,请使用旧密码解密内容加密密钥,并使用从新密码派生的密钥对其进行重新加密。您应该为新密码选择一个新的盐,并确保将其与新的加密密钥一起存储。
由于内容加密密钥是从一个巨大的空间中随机选择的,因此在加密时可以安全地使用ECB作为密码模式。
即使您使用的是盐,也不要简单地对密码进行哈希处理,即使您使用的是一个尚未完整的算法。您需要重复数千次哈希操作。在大多数平台上都有用于(正确)执行此操作的库。使用密钥派生算法(来自PKCS#5的PBKDF2)从密码创建密钥。
答案 1 :(得分:3)
首先,您通常不应将密码用作AES密钥。也许类似于密码的加密哈希(不是MD5)+盐(在这种情况下你会存储盐但不存储哈希)。
您可以做的一件事是使用随机密钥加密每个用户的文件,然后使用散列+盐渍密码加密该密钥。如果用户更改密码,则只需重新加密密钥。
答案 2 :(得分:2)
考虑将用于加密数据的密钥与用于访问数据的密钥分离的一种可能性。仔细完成,这允许用户根据需要随时更改密码,而您只需更改数据库中的一条记录。另外,您可以在方便的时候安排对加密数据的密钥进行更改。
它是如何运作的?
当用户想要更改密码时,这种间接级别的优势就出现了。如果您不使用某种与此类似的技术,则必须获取并验证旧密码和新密码,使用旧密码解密所有数据,并使用新密码重新加密。
使用间接级别,您仍然会提示用户输入旧密码(P1 U )及其新密码(P2 U )并验证它们,但是只需要解密E1 U ,然后用新的密钥K2 U,K 重新加密它,从新的盐S2 U 生成新密码P2 U 。您根本不必触摸加密数据。
对于间接级别,系统S还可以保留数据密钥K U,D 的第二个加密副本,使用系统密码加密。如果有必要或希望更改用于加密数据的密钥,则系统可以使用其加密的密钥副本来执行此操作。它可以记录用户在其键中最后记录的键,因此当用户返回查看数据时,它可以安排更改存储的键K2 U,D ,因为那时,它有自己的密码(剩下的时间,它没有)。
Kevin Kenan对“Cryptography in the Database: The Last Line of Defense”中的一些想法略有不同。 Kn U,K 键是KEK(密钥加密密钥)的示例。您还可以阅读本书中的关键系列,这有助于管理加密数据。
答案 3 :(得分:0)
太傻了。
AES使用256位密钥,因此当您说您将使用密码作为密钥时,它几乎不会与密钥大小要求一样长。