静态加密和/或AES_ENCRYPT

Chr*_*ris 9 mysql encryption

我正在尝试改进包含敏感数据的MySQL数据库的安全性.我正在努力掌握一些术语.如果我理解了这种情况,有人可以告诉我:

静态加密 - 似乎我可以在表级启用它.表中的所有数据都使用密钥加密.如果某人掌握了备份文件或获得了对服务器的物理访问权限,那么数据将受到保护.当然,这假定密钥存储在别处.

AES_ENCRYPT - 在我的表中插入/更新数据时我可以使用AES_ENCRYPT('data', 'password').通过SELECT查询数据我使用AES_DECRYPT

  1. 假设我只是在休息时使用加密,那么我需要在PHP代码中做任何不同的事情来查询数据吗?我的PHP代码是否需要通过我的PDO请求将密钥发送到数据库?或者我可以使用我的常规代码查询数据库并自动处理解密?

  2. 或者我误解了静止的加密方式,我需要使用AES_ENCRYPT替代/

Mar*_*tin 13

静止加密

静态加密是数据库中未使用/访问或更新的数据.移动中的加密就像TLS数据(来自数据库)从服务器传输到服务器到浏览器,服务器,浏览器等等.TLS在大多数情况下都是非常好的,如果它经过精心处理并且以的态度接近需要做的不仅仅是最低限度才能真正实现安全.

一个典型的例子就是人们在他们的域名上从LetsEncrypt那里获得了TLS证书,并认为突然他们所有的东西都是安全的; 但是他们没有加密他们的会话或他们的cookie,因此在他们的防御中留下了巨大的潜在漏洞.

不要使用MySQL的内置加密系统.

我不能强调这一点; MySQL内置的加密系统不适合实际的安全数据保护.

在这里阅读我对一个非常相似的问题的答案(我不想简单地复制/粘贴).

好吧,那么,因为你坚持......在这里:


我一直都明白不要使用 MySQL内置的加密功能,因为静态数据(在SQL中)的加密点是,如果服务器受到损害,那么数据的风险就不那么大了.

MySQL内置功能的问题在于它不适用于数据传递到" 静止 "状态和从" 静止 "状态传递的时间,因此任何数据的明文都可以记录在MySQL日志中(以及存储系统的其他位置) ,例如查询查找未加密,因此您可以在加密count之前/之前从众多查找及其结果中推断出列值.你可以在这里阅读更多相关信息.

关于加密,你应该使用一些经过试验和测试的库,如defuse/php-encryption.

从我在自己对这个主题的研究中所看到的,Magnus提供的用于化解/ php加密的链接是防止MySQL导致你破坏数据的最好方法之一,从不让MySQL程序/服务器永远看到你的数据的明文价值.

- 2017年5月7日发布的答案.


此外比尔Karwin的回答同样的问题,提出了一些有价值的额外的见解:

给马丁的答案+1,但我会添加一些信息,以确定它的价值.

MySQL 5.7已经为InnoDB表空间实现了静态加密(https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace-encryption.html).

据报道,MySQL 8.0还会为InnoDB重做日志和撤消日志文件(https://dev.mysql.com/doc/refman/8.0/en/innodb-tablespace-encryption.html)实施静态加密.

这仍然保留了未加密的查询日志和二进制日志.我们将不得不等待MySQL的未来版本.

为什么需要这么长时间?MySQL安全工程负责人上个月在Percona Live会议上的一次鸟类会议上表示,他们非常谨慎地实施加密.这意味着要实现加密功能,还要实现密钥安全性和密钥轮换以及其他用途.要做到这一点非常复杂,他们不希望实现一些会被弃用的东西,并使每个人的加密数据库无效.

- 2017年5月7日发布的答案.

结束点:

安全性很复杂.如果你想要正确地做到并对你的保护性洋葱皮有信心,那么你需要做很多事情(见下面的子弹); 但你需要做的第一件事是:

定义您要保护的人

认真.对于想要窃取您的明文名称和地址的人,与需要接管您的服务器的人相比,您需要采取不同的策略,而不是仅仅因为想要删除数据的人.这是一个神话,你可以一直保护所有人,按概念这是不可能的*; 因此,您需要定义最可能的agressors,然后找出如何最好地减轻他们的进步.

对于MySQL,有一些明确的建议:

  • 将SQL和PHP保存在同一台服务器上.不要远程访问MySQL数据.

  • 排除对SQL的外部访问(localhost仅限于此)

  • 模糊您的表名和列名; 如果有人闯入你的数据并且你已经%$HDTBJ^BTUETHNUYT在列下,username那么他们知道这个乱码可能是一个用户名,所以他们有一个很好的开始试图打破你的加密.

  • 重要提示:真正锁定您的桌面访问权限; 建立了许多MySQL用户,每个用户只有最低限度的特权来做他们需要的事情; 你希望用户读取表()和只读某些表; 用户写入某些表但无权访问其他表.如果MySQL上的任何一个用户遭到攻击,那么这是一个令人担忧的问题.你没有自动丢失那里的每一个数据.

  • 使用PHP加密服务.将加密密钥存储在完全独立的位置; 例如,你有另一个服务器,你只能用于备份,你可以访问它只是为了获取加密密钥,因此,如果你的PHP/MySQL服务器被泄露,你有一些空间来切断和锁定密钥服务器,所以你可以限制伤害.如果密钥服务器也有备份,那么你真的不会受到太多损害(取决于情况)

  • 设置大量手表和电子邮件告密者,以准确告诉您某些进程何时运行以及哪些服务器用户(不是人员而是程序)正在做什么.因此,您可以看到为什么意外的进程在凌晨5点开始运行以尝试测量MySQL表的大小.WTF?

  • 有很多可能让你的MySQL AES_ENCRYPT'数据被"嗅探",即使它没有在数据库中处于静止状态,但如果网站遭到入侵(或者更糟糕的是,PHP代码不安全),那么定时攻击可以解决数据内容通过定时查询查找和数据包返回.

  • 安全是一个黑洞; 在某些时候,你会想到"Sod this,我已经做得足够多了".没有人有完全的安全性,一些非常专注的组织有足够的安全性.你需要知道在离开远方之前你愿意走多远.


*为什么不可能?因为要始终保护您的数据免受所有威胁,所以它需要是不可读的,不可用的,就像哈希一样.哈希始终受到所有人的保护.但哈希永远不会被散乱.