2012-01-24 110 views
7

我有一个网站,用户提交他们的个人数据,我正在考虑使用aes-256加密这些数据,并且他们的密码被用作该加密的密钥,然后我将加密的数据存储在mysql数据库中。 ..如何在加密后更改aes-256密钥?

现在,如果用户改变他的密码我将如何改变加密数据

我应该收集数据库中的所有数据,然后用旧的密钥,然后用重新加密解密它的数据的关键新钥匙?

回答

13

当用户更改密码时,不需要重新加密所有用户的数据。

生成密钥来加密用户的数据;称这为“内容加密密钥”。从用户密码中获取密钥;将其称为“密钥加密密钥”。使用“密钥加密密钥”加密“内容加密密钥”。存储加密的密钥以及用于密钥派生的迭代次数。

如果他们更改密码,请使用旧密码解密内容加密密钥,然后使用新密码派生的密钥对其进行重新加密。您应该为新密码选择新盐,并确保将其与新的加密密钥一起存储。

因为内容加密密钥是从一个巨大的空间中随机选择的,所以在加密时可以安全地使用ECB作为密码模式。

即使您使用salt,即使使用尚未破坏的算法,也不要简单地对密码进行哈希处理。您需要重复数千次哈希操作。在大多数平台上都有这样做的库(正确)。使用密钥派生算法(PBKDF2,来自PKCS#5)从密码创建密钥。

这个概念如下the draft for password-based S/MIME encryption.

+0

加密密钥存储在哪里?在应用程序服务器上的内存中,还是在数据库服务器上的物理存储中? – dimiguel

+0

@dimgl存储在一些可靠,持久的存储中,并进行备份。绝对不在记忆中。除非你不在乎内容是否因停电而不可挽回地被破坏。 – erickson

0

这很愚蠢。

AES使用256位密钥,因此当您说您将使用密码作为密钥时,密钥的长度几乎与密钥大小要求一样长。

+0

我会散列他们的密码给我的256字节,然后用它在加密 –

+0

好吧,那么你的格式是什么建立密钥? –

3

首先,您通常不应将密码用作AES密钥。也许像密码哈希(而不是MD5)+盐(你会在这种情况下储存盐但不是哈希)。

你可以做的一件事是用随机密钥加密每个用户的文件,然后使用散列+密码加密该密钥。如果用户更改密码,则只需重新加密密钥。

2

一种可能性考虑解耦用于将数据从用于访问该数据的密钥加密密钥。仔细完成,这允许用户随意更改密码,而只更改数据库中的一条记录。另外,您可以安排对密钥进行的更改,以便在您方便时加密其数据。

它是如何工作的?

  • 您使用随机生成的密钥来加密用于用户U的数据d,K U,d
  • 您加密密钥K U,d有独立的密钥K1 ü,K从随机盐产生,S1 û(你保持的记录)和用户的密码P1 ù(你可能会或可能不会跟踪)。加密的密钥是E1 U
  • 您存储S1 U和K1 U,K准备好当用户想要访问他们的数据时。
  • 当用户U想访问他们的数据,他们为您提供他们的密码,P1 ü,和你抬头S1 ü和K1 ü,K从数据再生,并用它来解密E1 ü,让您ķ U,d一次,与您解密他们的实际数据。
  • 你保证,你可以检测时给出的密码是正确的,所以你不要喷涌向前二元乱码,如果用户类型错误的密码。

当用户想要更改他们的密码时,这种间接性的好处就来了。如果您不使用某种类似于此的技术,则必须获取并验证旧密码和新密码,使用旧密码解密所有数据,然后使用新密码对其进行重新加密。

随着间接的水平,你仍然提示他们的旧密码的用户(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(密钥加密密钥)的例子。您还可以阅读本书中的关键系列,这将有助于管理加密数据。