Halite / Doctrine vs MySQL AES_ENCRYPT:安全/性能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Halite / Doctrine vs MySQL AES_ENCRYPT:安全/性能相关的知识,希望对你有一定的参考价值。
我有一个Web应用程序(Symfony 4),需要符合HIPAA标准,其中(除其他外)意味着我需要加密数据。最初我只是通过Halite加密php中的数据并将其保存在数据库中,但是有些字段(姓氏,名字,电话号码)我无法加密,因为它们将用于搜索字段,因此我需要(?)mysql才能使用where子句。
出于这个原因,我将使用AES_ENCRYPT
并设置MySQL连接以通过本地端口转发隧道转发ssh,以便连接是安全的,没有人能够获得密码。
我一直看到文章,虽然AES_ENCRYPT
是一个坏主意,这些东西应该只是用PHP保护。如果我这样做,我需要将所有记录拉下来,解密它们,然后进行PHP搜索 - 当然不会像MySQL那样快(?)。这个表可能有数千个条目。
对此有什么建议吗?我是否在思考它?如果我通过ssh建立连接,那么通过MySQL做什么会有什么风险呢?
在互联网上有这么多的建议,很难知道什么是对的= /非常感谢提前!
如果您乐意使用精确查找,则可以在加密字段上实现查找,而无需降低性能。您绝对应该在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必要的原因。
以上是关于Halite / Doctrine vs MySQL AES_ENCRYPT:安全/性能的主要内容,如果未能解决你的问题,请参考以下文章
学说: cascade="remove" vs orphanRemoval=true
EF 连接 mysq l数据库 code first模式 的实践
Doctrine 2:表单字段显示 Doctrine\Common\Collections\ArrayCollection@00 作为值