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