首页 > 解决方案 > Halite/Doctrine vs MySQL AES_ENCRYPT:安全/性能

问题描述

我有一个需要符合 HIPAA 的 Web 应用程序(Symfony 4),这(除其他外)意味着我需要加密数据。最初我只是打算通过 Halite 加密 PHP 中的数据并将其保存在数据库中,但是有些字段(姓氏、名字、电话号码)我无法加密,因为它们将用于搜索字段,因此我需要 (?) MySQL 才能使用 where 子句。

出于这个原因,我打算使用AES_ENCRYPT并设置 MySQL 连接以通过本地端口转发隧道通过 ssh,以便连接是安全的,并且没有人能够获得密码。

我一直在看文章,尽管这AES_ENCRYPT是一个坏主意,而且这些东西应该只用 PHP 保护。如果我这样做,我需要将所有记录拉下来,解密它们,然后进行 PHP 搜索——当然不会像 MySQL 那样快(?)。该表可能有数千个条目。

对此有什么建议吗?我是不是想多了?如果我通过 ssh 进行连接,通过 MySQL 进行操作会有什么风险?

互联网上有很多建议,很难知道什么是正确的=/提前非常感谢!

标签: phpmysqlsecurityencryptiondoctrine

解决方案


如果您乐于使用精确查找,则可以在加密字段上实现查找,而无需性能成本。您绝对应该在您的 PHP 代码中实现加密逻辑。

如果您目前有桌子,请说:

(id, first_name, last_name, email)

我们首先为您要加密的字段添加额外的列,因此我们的表变为

(id, first_name, first_name_lu, last_name, last_name_lu, email)

当我们更新或插入一行时,我们做两件事:

  • 使用第一个对称密钥,我们加密所需的字段。该结果在原始列中。
  • 使用第二个对称密钥,我们对必填字段进行 HMAC。这个结果在*_lu列中。

当我们想要执行查找时,我们:

  • 使用第二个对称密钥,HMAC 搜索查询,然后*_lu根据结果查找列。
  • 如果我们找到匹配项,那么原始列中的加密值就是我们搜索的值。

您可能想知道为什么 HMAC 是必需的,为什么我们不能重新加密和比较?我们可以这样做,但这也意味着我们必须使用ECB模式进行加密,这是一个很大的安全漏洞。应改为使用 GCM 或 CBC。这就是使 HMAC 成为必要的原因。


推荐阅读