如何加密 Web 应用程序数据库中的敏感数据?

信息安全 加密 Web应用程序 数据库
2021-09-05 20:36:19

我的网络应用程序的数据库存储敏感数据。如果攻击者获得了对数据库的访问权,他就不应该访问这些数据。这就是为什么我要在数据库中加密这些敏感数据。

首先,我想用用户的用户名或密码作为密钥来加密用户数据。这种方法的问题是用户能够更改他的用户名和密码。如果用户更改了他的用户名,应用程序就不能再解密用他的旧用户名加密的数据了。此外,攻击者可以访问用户的用户名。因此,这不是一个非常安全的解决方案。

我唯一的另一个想法是使用一个全局密钥加密所有用户数据。这样做的一个缺点是整个系统依赖于一个密钥。在这种情况下,由于新密钥和旧数据不兼容,我无法更改密钥。

你对这个问题有什么更好的想法吗?

3个回答

普遍接受的方法类似于 AndrolGenhald 在较早的答案中建议的方法,但有一些改进。

您可以使用从其密码派生的密钥单独加密每个用户的数据。但是,您不希望将密码直接用作密钥。这是一个多步骤的过程,如下所示。

1)您使用 CSPRNGm 生成一个随机密钥,并使用此随机密钥加密用户的数据。您可以为每个用户创建一个新的、不同的随机密钥。这称为 DEK,或数据加密密钥。

2)您获取用户的密码并通过 PBKDF(例如 PBKDF2、bcrypt 或 scrypt)运行它,使用相当高的工作因子或迭代次数和随机盐来创建第二个密钥、KEK 或密钥加密-钥匙。然后,您使用 KEK 加密 DEK,并将加密的 DEK 和 salt 存储在数据库中。

然后,当用户登录时,您使用他们的密码和数据库中的 salt 重新生成 KEK,您可以使用它来解密 DEK,您可以使用它来解密数据。

现在,当用户更改密码时,您不再需要解密和重新加密他们的所有数据,而只需使用新密码(和新盐)生成新的 KEK,并使用它重新加密 DEK新的 KEK。

您可以:

  1. 每当用户更改其用户名或密码时重新加密所有内容
  2. 为您用于加密数据的每个用户生成一个随机密钥,然后使用用户的密码(或用户名+密码)加密此密钥

我不建议只使用用户名作为密钥,即使您确实存储了加密的用户名(这似乎有点极端),用户名通常不被视为秘密。

如果您想加密存储在数据库中的用户信息,我建议您不要将用于解密数据的密钥存储在同一数据库中。我会使用存储在其他地方的秘密来加密内容,并使用更严格的访问策略。这样,攻击者需要同时访问您的密钥存储和数据库才能获取该数据。这分散了攻击面。