我有一个网站,用户提交他们的个人数据,我正在考虑使用aes-256加密这些数据,并且他们的密码被用作该加密的密钥,然后我将加密的数据存储在mysql数据库中。 ..如何在加密后更改aes-256密钥?
现在,如果用户改变他的密码我将如何改变加密数据
我应该收集数据库中的所有数据,然后用旧的密钥,然后用重新加密解密它的数据的关键新钥匙?
我有一个网站,用户提交他们的个人数据,我正在考虑使用aes-256加密这些数据,并且他们的密码被用作该加密的密钥,然后我将加密的数据存储在mysql数据库中。 ..如何在加密后更改aes-256密钥?
现在,如果用户改变他的密码我将如何改变加密数据
我应该收集数据库中的所有数据,然后用旧的密钥,然后用重新加密解密它的数据的关键新钥匙?
当用户更改密码时,不需要重新加密所有用户的数据。
生成密钥来加密用户的数据;称这为“内容加密密钥”。从用户密码中获取密钥;将其称为“密钥加密密钥”。使用“密钥加密密钥”加密“内容加密密钥”。存储加密的密钥以及用于密钥派生的迭代次数。
如果他们更改密码,请使用旧密码解密内容加密密钥,然后使用新密码派生的密钥对其进行重新加密。您应该为新密码选择新盐,并确保将其与新的加密密钥一起存储。
因为内容加密密钥是从一个巨大的空间中随机选择的,所以在加密时可以安全地使用ECB作为密码模式。
即使您使用salt,即使使用尚未破坏的算法,也不要简单地对密码进行哈希处理。您需要重复数千次哈希操作。在大多数平台上都有这样做的库(正确)。使用密钥派生算法(PBKDF2,来自PKCS#5)从密码创建密钥。
这很愚蠢。
AES使用256位密钥,因此当您说您将使用密码作为密钥时,密钥的长度几乎与密钥大小要求一样长。
我会散列他们的密码给我的256字节,然后用它在加密 –
好吧,那么你的格式是什么建立密钥? –
首先,您通常不应将密码用作AES密钥。也许像密码哈希(而不是MD5)+盐(你会在这种情况下储存盐但不是哈希)。
你可以做的一件事是用随机密钥加密每个用户的文件,然后使用散列+密码加密该密钥。如果用户更改密码,则只需重新加密密钥。
一种可能性考虑解耦用于将数据从用于访问该数据的密钥加密密钥。仔细完成,这允许用户随意更改密码,而只更改数据库中的一条记录。另外,您可以安排对密钥进行的更改,以便在您方便时加密其数据。
它是如何工作的?
当用户想要更改他们的密码时,这种间接性的好处就来了。如果您不使用某种类似于此的技术,则必须获取并验证旧密码和新密码,使用旧密码解密所有数据,然后使用新密码对其进行重新加密。
随着间接的水平,你仍然提示他们的旧密码的用户(P1 ü)和新密码(P2 ü),并对其进行验证,但你只有解密E1 ù和然后用新的密钥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”中的一些想法的轻微变化。密钥是KEK(密钥加密密钥)的例子。您还可以阅读本书中的关键系列,这将有助于管理加密数据。
加密密钥存储在哪里?在应用程序服务器上的内存中,还是在数据库服务器上的物理存储中? – dimiguel
@dimgl存储在一些可靠,持久的存储中,并进行备份。绝对不在记忆中。除非你不在乎内容是否因停电而不可挽回地被破坏。 – erickson