【问题标题】:How to change the aes-256 key after encryption?加密后如何更改 aes-256 密钥?
【发布时间】:2012-02-17 09:27:18
【问题描述】:

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

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

我应该从数据库中收集所有数据,然后用旧密钥解密他们的数据,然后用新密钥再次加密吗?

【问题讨论】:

    标签: security aes


    【解决方案1】:

    当用户更改密码时,您无需重新加密所有用户数据。

    生成一个密钥来加密用户的数据;将此称为“内容加密密钥”。从用户密码中导出密钥;将此称为“密钥加密密钥”。使用“密钥加密密钥”对“内容加密密钥”进行加密。将加密密钥与盐和用于密钥派生的迭代次数一起存储。

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

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

    不要简单地对密码进行哈希处理,即使您使用盐,即使您使用尚未破解的算法。您需要重复哈希操作数千次。在大多数平台上都有可以(正确)执行此操作的库。使用密钥派生算法(PBKDF2,来自 PKCS #5)根据密码创建密钥。

    这个概念遵循the draft for password-based S/MIME encryption.

    【讨论】:

    • 加密密钥将存储在哪里?在应用服务器的内存中,还是在数据库服务器的物理存储中?
    • @dimgl 存储在一些可靠的持久存储中,并带有备份。绝对不在记忆中。除非您不在乎内容是否因停电而不可挽回地被破坏。
    • “因为内容加密密钥是从巨大的空间中随机选择的”如何帮助解决 ECB 的问题?
    • @Freek 因为与特定密钥加密密钥一起使用的每个明文(内容加密密钥)都是唯一的,所以生成的密文也是如此。
    • 在此处另见 Applied Cryptography 的第二条引述。
    【解决方案2】:

    首先,您通常不应将密码用作 AES 密钥。可能类似于密码的加密哈希(不是 MD5)+ 盐(在这种情况下,您将存储盐但不存储哈希)。

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

    【讨论】:

      【解决方案3】:

      一种可以考虑的可能性是将用于加密数据的密钥与用于访问数据的密钥分离。仔细完成后,这允许用户根据需要随时更改密码,而您只更改数据库中的一条记录。另外,您可以在方便时安排更改加密数据的密钥。

      它是如何工作的?

      • 您使用随机生成的密钥 KU,D 为用户 U 加密数据 D。
      • 您使用从随机盐 S1U 生成的单独密钥 K1U,K 加密密钥 KU,D(其中您保留记录)和用户密码 P1U(您可能会或可能不会记录)。加密密钥为 E1U
      • 您存储 S1U 和 K1U,K 以备用户想要访问其数据时使用。
      • 当用户 U 想要访问他们的数据时,他们会向您提供他们的密码 P1U,然后您查找 S1U 并重新生成 K1U,从该数据中提取 K,并使用它来解密 E1U,再次给您 KU,D,您可以使用它解密他们的实际数据。李>
      • 您确保可以检测到所提供的密码何时正确,这样您就不会在用户输入错误密码时产生二进制乱码。

      当用户想要更改他们的密码时,这种间接级别的优势就出现了。如果不使用与此类似的技术,则必须获取并验证旧密码和新密码,用旧密码解密所有数据,然后用新密码重新加密。

      使用间接级别,您仍然会提示用户输入他们的旧密码 (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(密钥加密密钥)的示例。您还可以阅读书中有关密钥系列的信息,这将有助于管理加密数据。

      【讨论】:

        【解决方案4】:

        真傻。

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

        【讨论】:

        • 我将哈希他们的密码给我 256 字节然后在加密中使用它
        猜你喜欢
        • 1970-01-01
        • 2017-06-07
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-11
        • 2011-09-26
        • 1970-01-01
        相关资源
        最近更新 更多