加密静态数据


Encrypt data at rest

我一直在寻找这个话题。

我发现了一些关于数据库级别(MySQL)加密数据的话题。但它只能在5.7版

现在我想找到一个解决方案的例子,请如何我可以加密数据与应用程序。

我使用PHP与MySQL数据库。例如,我想加密数据库中的银行账号

我有一个名为bank的表,其中列id, name, account_number

如何加密帐号?它与PHP的普通加密方法有何不同?

我希望我把我的问题解释清楚了。如果我能提供更多的细节,请告诉我。

我建议您看看这个为MySQL数据库提供零知识加密的开源项目。它使用AES-256加密进入数据库的数据,然后解密结果集,使加密对应用程序透明。这超越了"静态"answers"传输中"的加密,确保在数据泄露的情况下,黑客在对数据库运行SQL查询时无法看到未加密的数据。

http://www.agildata.com/agildata-zero-zero-knowledge-encryption-mysql/


(注:我是AgilData的首席架构师)

老实说,我建议在文件系统或硬件级别使用加密存储,并让MySQL正常工作。如果您使用Amazon,他们支持加密的EBS卷和S3桶。

MySQL有可以在SQL表达式中调用的加密函数。见https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html

例如:

INSERT INTO bank 
SET id = 1234, 
    name = 'ABC Bank', 
    account_number = AES_ENCRYPT('8675309', 'password');

那么你必须在读取时解密:

SELECT name, AES_DECRYPT(account_number, 'password')
FROM bank WHERE id = 1234;
这种方法的一个大问题是,你的密码是在纯文本在您的查询日志和二进制日志!对我来说,这似乎是个坏消息。这就是为什么透明数据加密(TDE)更可取的原因。

然而,我知道没有专门为MySQL社区或MySQL企业或其他MySQL变体构建的TDE实现。

MySQL Enterprise声称有补充的加密功能(https://www.mysql.com/products/enterprise/encryption.html),但这实际上只是一些可以在SQL表达式中调用的额外函数。这是不透明的,因为您必须更改应用程序代码,以便在每次插入或提取数据时显式地调用加密函数。

MariaDB 10.1声称支持透明加密存储,文档在这里:https://mariadb.com/kb/en/mariadb/data-at-rest-encryption/我没有使用过,但是他们的实现有很多限制,我不认为这是一个很好的解决方案。例如:二进制日志、查询日志、错误日志等不能不加密,可能导致敏感数据泄露。另外,有些备份工具不能在加密的数据库上工作。

加密存储不能帮助加密飞行中的数据,即在网络上,当应用程序从数据库服务器获取数据时。对于传输中的数据,所有MySQL变体都支持SSL网络连接。

当数据存在于应用程序本身的RAM中,或者存在于各种缓存层(如memcached或squid或MySQL查询缓存中)时,您仍然需要担心数据。

数据也存在于备份和日志中。制定一个保护这些的计划。它们是如何存储的?谁有权限?它们会被复制到不安全的环境中吗?它们被安全处理了吗?