【发布时间】:2012-02-17 09:27:18
【问题描述】:
我有一个网站,用户提交他们的个人数据,我正在考虑使用 aes-256 加密这些数据,他们的密码用作加密的密钥,然后我将加密的数据存储在 mysql 数据库中...
现在如果用户更改他的密码,我将如何更改加密数据的密钥
我应该从数据库中收集所有数据,然后用旧密钥解密他们的数据,然后用新密钥再次加密吗?
【问题讨论】:
我有一个网站,用户提交他们的个人数据,我正在考虑使用 aes-256 加密这些数据,他们的密码用作加密的密钥,然后我将加密的数据存储在 mysql 数据库中...
现在如果用户更改他的密码,我将如何更改加密数据的密钥
我应该从数据库中收集所有数据,然后用旧密钥解密他们的数据,然后用新密钥再次加密吗?
【问题讨论】:
当用户更改密码时,您无需重新加密所有用户数据。
生成一个密钥来加密用户的数据;将此称为“内容加密密钥”。从用户密码中导出密钥;将此称为“密钥加密密钥”。使用“密钥加密密钥”对“内容加密密钥”进行加密。将加密密钥与盐和用于密钥派生的迭代次数一起存储。
如果他们更改密码,请使用旧密码解密内容加密密钥,然后使用从新密码派生的密钥重新加密。您应该为新密码选择一个新的 salt,并确保将其与新的加密密钥一起存储。
由于内容加密密钥是从巨大的空间中随机选择的,所以加密时可以安全地使用ECB作为密码模式。
不要简单地对密码进行哈希处理,即使您使用盐,即使您使用尚未破解的算法。您需要重复哈希操作数千次。在大多数平台上都有可以(正确)执行此操作的库。使用密钥派生算法(PBKDF2,来自 PKCS #5)根据密码创建密钥。
【讨论】:
首先,您通常不应将密码用作 AES 密钥。可能类似于密码的加密哈希(不是 MD5)+ 盐(在这种情况下,您将存储盐但不存储哈希)。
您可以做的一件事是使用随机密钥加密每个用户的文件,然后使用散列+加盐密码加密该密钥。如果用户更改密码,您只需重新加密密钥即可。
【讨论】:
一种可以考虑的可能性是将用于加密数据的密钥与用于访问数据的密钥分离。仔细完成后,这允许用户根据需要随时更改密码,而您只更改数据库中的一条记录。另外,您可以在方便时安排更改加密数据的密钥。
它是如何工作的?
当用户想要更改他们的密码时,这种间接级别的优势就出现了。如果不使用与此类似的技术,则必须获取并验证旧密码和新密码,用旧密码解密所有数据,然后用新密码重新加密。
使用间接级别,您仍然会提示用户输入他们的旧密码 (P1U) 和他们的新密码 (P2U) 并验证它们,但是您只需解密 E1U,然后使用新的盐 S2U 生成的新密钥 K2U,K 和新密码 P2U。您根本不必接触加密数据。
通过间接级别,系统 S 还可以保留数据密钥 KU,D 的第二个加密副本,使用系统密码加密。如果有必要或需要更改用于加密数据的密钥,系统可以使用其加密的密钥副本来执行此操作。它可以记录用户上次在他们的密钥中记录哪个密钥,因此当用户返回查看数据时,它可以安排更改存储的密钥 K2U,D 因为那时,它有他们的密码(其余时间,它没有)。
这是 Kevin Kenan 的“Cryptography in the Database: The Last Line of Defense”中的一些想法的轻微变化。 KnU,K 密钥是 KEK(密钥加密密钥)的示例。您还可以阅读书中有关密钥系列的信息,这将有助于管理加密数据。
【讨论】:
真傻。
AES 使用 256 位密钥,因此当您说您将使用他们的密码作为密钥时,它几乎不会与密钥大小要求一样长。
【讨论】: