在数据存储中进行加密

4

我已经搜索了一段时间关于这个主题。

我发现一些文章谈论在数据库层面(MySQL)加密数据。但是它只适用于5.7版本及以上。

现在我想找到一个解决方案,并请给出一个示例,我如何使用应用程序加密数据。

我正在使用PHP与MySQL数据库。我想在我的数据库中加密例如银行帐号等信息。

我有一个名为bank的表,其中包含idnameaccount_number三列。

如何加密账户号码?与PHP的常规加密方法有何不同?

我希望我能清楚地说明我的问题。如果需要更多细节,请让我知道。


2
不要加密列,而是要加密驱动器。如果这是需要仔细处理的敏感数据,您必须聘请安全顾问提供建议。这很容易出错。 - tadman
2个回答

3
我建议您查看这个开源项目,为MySQL数据库提供零知识加密。该项目使用AES-256对进入数据库的数据进行加密,然后解密结果集,使加密对应用程序透明。这超越了“静止”和“在传输中”的加密,通过确保在数据泄露事件中,黑客在针对数据库运行SQL查询时无法看到未加密的数据。

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


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

1
你应该真正编辑你的回答以披露你为AgilData工作的事实。此外,仅包含链接的答案不受欢迎,因为它们不包含可搜索的内容。 - zaph

1
老实说,我建议在文件系统或硬件层面使用加密存储,然后让MySQL正常工作。如果您使用亚马逊,他们支持加密的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 Community或MySQL Enterprise或其他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查询缓存)中。
数据还存在于备份和日志中。制定保护这些数据的计划。它们如何存储?谁有访问权限?它们是否曾经被复制到不安全的环境中?它们是否被安全地处置?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接