我正在尝试改进包含敏感数据的MySQL数据库的安全性。我正在努力掌握一些术语。如果我理解了这种情况,有人可以告诉我:
静态加密 - 似乎我可以在表级启用此功能。表中的所有数据都使用密钥加密。如果某人掌握了备份文件或获得了对服务器的物理访问权限,那么数据将受到保护。当然,这假设密钥存储在其他地方。
AES_ENCRYPT - 在我的表中插入/更新数据时,我可以使用AES_ENCRYPT('data', 'password')
。通过SELECT查询数据时,我使用AES_DECRYPT
假设我只是在休息时使用加密那么我需要在我的PHP代码中做任何不同的事情来查询数据吗?我的PHP代码是否需要通过我的PDO请求将密钥发送到数据库?或者我可以使用我的常规代码查询数据库并自动处理解密吗?
或者我误解了静态加密,我需要使用AES_ENCRYPT
代替/
答案 0 :(得分:10)
静态加密是数据库中未使用/访问或更新的数据。移动中的加密类似于TLS
,其中数据(来自数据库的 )从服务器传输到服务器到浏览器,到服务器,再到浏览器等.TLS在大多数情况下都非常好用这种情况如果经过仔细处理并以一种态度接近,那么 你需要做的事情超过最低限度 才能真正实现其安全性。
一个典型的例子是人们在他们的域名上从LetsEncrypt获得TLS证书,并认为他们的所有东西都是安全的;但他们不会加密他们的会话或他们的cookie ,因此在他们的防御中留下了巨大的潜在漏洞。
我不能强调这一点; MySQL内置的加密系统不适合实际的安全数据保护。
请详细阅读my answer to a very similar question here(我不想简单地复制/粘贴)。
好的,那么,因为你坚持......在这里:
我一直都明白不使用 MySQL内置的加密功能,因为静态数据(在SQL中)的加密点是,如果服务器被泄露,数据不是那么大的风险。
MySQL内置功能的问题在于,它不适用于何时将数据传递给" at rest "状态,因此任何数据的明文都可以记录在MySQL日志中(以及存储系统上的其他位置,例如查询查找未加密,因此您可以在多次查找和
count
结果推导列值之前)/之前它是加密的。 You can read more about this here关于加密,您应该使用一些久经考验的库,例如defuse/php-encryption。
从我自己对此主题的研究中所读到的内容,Magnus提供给defuse/php-encryption的链接是阻止MySQL导致您破坏数据的最好方法之一,从不放过MySQL程序/服务器曾经看到你的数据的明文值。
- 2017年5月7日发布的答案。
同样Bill Karwin's answer to the same question提供了一些有价值的额外见解:
+1给Martin的答案,但我会为它的价值添加一些信息。
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,然后找出如何最好地减轻他们的进步。
Sepcifically to MySQL,一些明确的建议:
将SQL和PHP保持在同一台服务器上。不要远程访问MySQL数据。
排除对SQL的外部访问权限(仅限localhost
)
模糊您的表名和列名;如果有人闯入您的数据并且您在列%$HDTBJ^BTUETHNUYT
下有username
,那么他们就知道这个乱码可能是一个用户名,因此他们在尝试破解您的加密方面有一个很好的开端。
重要 :真正锁定您的表格访问权限;建立了许多MySQL用户,每个用户只有最低限度的特权来做他们需要的事情;您希望用户阅读表格( 仅 )并且只读取某些表格;用户写入某些表但无权访问其他表。它的关注分离,以便MySQL上的任何一个用户受到损害;你不会自动丢失那里的每一个数据。
使用PHP加密服务。将加密密钥存储在完全独立的位置;例如,你有另一个服务器,你只能用于备份,你可以访问它只是为了获取加密密钥,因此,如果你的PHP / MySQL服务器被泄露,你有一些空间来切断和锁定密钥服务器,所以你可以限制伤害。如果密钥服务器也有备份,那么你真的不会受到太大的损害(依赖于情境)
设置大量手表和电子邮件告密者,以准确告诉您某些进程何时运行以及哪些服务器用户(不是人员而是程序)正在执行哪些操作。因此,您可以看到为什么意外的进程在凌晨5点开始运行以尝试测量MySQL表的大小。 WTF?
很有可能让您的MySQL AES_ENCRYPT数据"嗅探"即使它没有在数据库中处于静止状态,但如果网站遭到破坏(或者更糟糕的是,PHP代码是不安全的),那么定时攻击可以通过定时查询查找和数据包返回来计算出数据内容。
安全是一个黑洞;在某些时候,你会思考" Sod this,我已经做得足够了#34;。没有人拥有完全的安全性,一些非常专注的组织具有足够的安全性。在离开远方之前,你需要弄清楚你愿意走多远。
* 为什么不可能?因为要始终保护您的数据免受所有威胁,所以它需要是不可读的,不可用的,就像哈希一样。哈希始终受到所有人的保护。但哈希永远不会被散乱。