2

我发现自己在一个站点上有一组用户,他们都存储了用户名和密码,允许他们通过 SOAP 自动访问第三方服务。这个想法是每个用户应该只需要登录到主站点来访问多个服务,使用他们各自为每个服务存储的用户信息。我觉得这些数据在存储时应该在我的数据库中加密,然后在用户需要访问给定服务时在传递给 php/SOAP 函数时自动解密。实现这一目标的最佳方法是什么?

我看过 AES_ENCRYPT,但似乎加密和解密使用了一个必须以纯文本形式存储在我的代码中的密钥……这似乎不是最聪明的事情. 无论如何,这是我第一次做这样的事情(如果你不知道的话);如果你能给我一些关于我应该如何处理这个问题的指示,我将非常感激。

提前谢谢了

4

1 回答 1

3

您偶然发现了加密数据库中数据的最大问题:

➽ 钥匙存放在哪里?

加密不能解决保护数据的问题,它只能将其“集中”到一个密钥上。无论您将密钥存储在何处,您的应用程序都必须能够解密数据,攻击者也可以这样做。我知道这个问题有两种可能的解决方案:

  1. 将钥匙放在尽可能安全的地方。这意味着,它肯定应该放在服务器上无法访问的目录中的 www-root 目录之外。根据数据的重要性,您还可以考虑将加密外包给另一台专用服务器。
  2. 根本不存储密钥并从用户密码中派生它。这是唯一真正安全的方法,因为那时甚至服务器都无法解密数据。当然,缺点是用户每次使用您的服务时都需要输入密码。如果用户更改密码,则需要重新加密所有数据。如果用户忘记密码,数据就会丢失。

PS 我建议在将数据存储到数据库之前对其进行加密,因为 MySQL AES_ENCRYPT 使用没有 IV 的 ECB 模式。这允许搜索某个值,但安全性较低(我很确定您不想通过密码搜索)。

于 2013-10-30T10:00:56.083 回答