我正在努力提高mysql数据库的安全性,该数据库将包含敏感数据。我正在努力掌握一些术语。有没有人能让我知道我是否正确地理解了情况:
静态加密-看起来我可以在表级别启用它。表中的所有数据都使用密钥加密。如果有人获得了备份文件或获得了对服务器的物理访问,那么数据将受到保护。当然,这假设密钥存储在其他地方。
aes\ U encrypt-在表中插入/更新数据时,我可以使用 AES_ENCRYPT('data', 'password')
. 当通过select查询数据时,我使用 AES_DECRYPT
假设我只是在休息时使用加密,那么我需要在php代码中执行任何不同的操作来查询数据吗?我的php代码需要通过pdo请求将密钥发送到数据库吗?或者我可以使用我的普通代码来查询数据库,然后自动处理解密?
或者我误解了静态加密的作用,我需要使用它吗 AES_ENCRYPT
相反/也是
1条答案
按热度按时间7d7tgy0s1#
静态加密
静态加密是指数据库中未被使用/访问或更新的数据。移动加密就像
TLS
数据(来自数据库)从一个服务器传输到另一个服务器,再传输到另一个浏览器,再传输到服务器,再传输到另一个浏览器,等等。在大多数情况下,tls都是非常好的,如果它被小心地处理,并且以一种你需要做更多的事情的态度来处理,而不是简单的最低限度,以使它真正地安全。一个典型的例子是,人们在自己的域上放置了一个来自letsencrypt的tls证书,然后突然认为自己所有的东西都是安全的;但是他们不加密他们的会话或者他们的cookies,所以在他们的防御中留下了一个巨大的潜在漏洞。
不要使用mysql的内置加密系统。
我怎么强调都不过分;mysql内置的加密系统不适合实际的安全数据保护。
请阅读我对一个非常类似的问题的答案,这里的细节(我不想简单地复制/粘贴)。
好吧,那么,因为你坚持。。。。在这里:
我一直都明白不要使用mysql的内置加密功能,因为静态数据加密(在sql中)的关键在于,如果服务器被破坏,数据就不会有[那么多]风险。
mysql内置功能的问题在于,它不适用于数据在“静止”状态之间的传递,因此任何数据的纯文本都可以记录在mysql日志中(存储系统的其他地方,例如查询查找,都没有加密,因此您可以从多个查找及其结果中进行加密)
count
结果在加密前/加密时推断列值。你可以在这里了解更多。关于加密,您应该使用一些久经考验的库,比如defuse/php encryption。
从我在这个主题的研究中读到的内容来看,magnus提供的defuse/php加密的链接是防止mysql破坏数据的最好方法之一,它从不让mysql程序/服务器看到数据的明文值。
--答案发布于2017年5月7日。
此外,比尔·卡尔温对同一问题的回答提供了一些有价值的额外见解:
+马丁的答案是1,但我会补充一些信息。
MySQL5.7已经为innodb表空间实现了静态加密(https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace-encryption.html).
据报道,mysql 8.0还将为innodb redo log和undo log文件实现静态加密(https://dev.mysql.com/doc/refman/8.0/en/innodb-tablespace-encryption.html).
这仍然会留下未加密的查询日志和二进制日志。为此,我们必须等待mysql的未来版本。
为什么要花这么长时间?mysql的安全工程负责人在上个月(2017年4月)percona live大会上的一次重要会议上表示,他们正在非常谨慎地实施正确的加密。这意味着要实现加密功能,还要实现密钥安全性和密钥轮换以及其他用途。要做到这一点非常复杂,而且他们不想实现一些会被弃用并使每个人的加密数据库都无效的东西。
--答案发布于2017年5月7日。
结束点:
安全是复杂的。如果你想做得很好并且对你的洋葱皮有信心,那么你需要做很多事情(见下面的项目);但你要做的第一件事是:
定义你要保护的对象
说真的。你需要不同的策略来对付那些想窃取你的明文姓名和地址的人,或者是那些想接管你的服务器的人,或者是那些仅仅因为你的原因就想丢弃数据的人。这是一个神话,你可以保护对所有人的时间,根据概念,这是不可能的*;因此,你需要确定最有可能的攻击者,然后找出如何最好地缓解他们的进展。
特别是对mysql,有一些明确的建议:
将sql和php保持在同一台服务器上。不要远程访问mysql数据。
排除对sql的外部访问(因此
localhost
(仅限)混淆表名和列名;如果有人闯入你的数据
HDTBJ^BTUETHNUYT
在柱子下面username
然后他们知道这个乱码可能是一个用户名,所以他们有一个很好的开始,试图打破你的加密。重要事项:真正锁定您的表访问;设置大量的mysql用户,每个用户都只有最少的权限去做他们需要的事情;您希望用户读取表(仅)并且只读取某些表;用户无法写入某些表,但无法访问其他表。它的关注点是分离的,这样如果mysql上的任何一个用户受到威胁;你不会自动丢失里面的所有数据。
使用php加密服务。将加密密钥存储在完全独立的地方;例如,有另一个服务器,您可以使用它来备份,您可以访问它来获取加密密钥,因此,如果您的php/mysql服务器受到威胁,您就有一些空间来切断并锁定密钥服务器,这样您就可以限制损坏。如果密钥服务器也有备份,那么实际上您不会受到太大的损害(视情况而定)。
设置大量的观察者和电子邮件通知者来准确地告诉您某些进程何时在运行,哪些服务器用户(不是人而是程序)在做什么。因此,您可以了解为什么一个意外的进程在凌晨5点开始运行,以尝试测量mysql表的大小。世界跆拳道联盟?
有很多可能让你的mysql aesè加密的数据“嗅探”,即使它不是在数据库休息,但如果网站受到损害(或更糟的是,php代码是不安全的),那么计时攻击可以通过计时查询查找和数据包返回的数据内容。
安全是一个黑洞;总有那么一天你会想“该死,我已经做得够多了”。从来没有人拥有完全的安全,一些非常敬业的组织有足够的安全。在你走完这段距离之前,你需要计算出你愿意走多远。