Halite / Doctrine与MySQL AES_ENCRYPT:安全/性能

时间:2018-09-12 20:56:19

标签: php mysql security encryption doctrine

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

由于这个原因,我将使用AES_ENCRYPT并将MySQL连接设置为通过本地端口转发隧道通过ssh,以便连接将是安全的并且没有人能够获取密码。 / p>

尽管AES_ENCRYPT是一个糟糕的主意,但我一直在看文章,而这些东西应该只用PHP进行保护。如果这样做,我将需要拉下所有记录,解密它们,然后进行PHP搜索-肯定不是MySQL可以做到的那么快(?)。该表可以包含数千个条目。

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

互联网上有很多建议,很难知道什么是对的= /提前谢谢!

1 个答案:

答案 0 :(得分:2)

如果您愿意使用精确查找,则可以在不影响性能的情况下对加密字段实施查找。您绝对应该在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变得必要的原因。