我一直在寻找这个话题。
我发现了一些关于数据库级别(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查询缓存中)时,您仍然需要担心数据。
数据也存在于备份和日志中。制定一个保护这些的计划。它们是如何存储的?谁有权限?它们会被复制到不安全的环境中吗?它们被安全处理了吗?