我知道我可以加密数据库的特定字段,但我对加密数据库的每个字段感兴趣。我想确保任何获得 mysql shell 访问权限但没有解密密钥的人都无法从数据库中读取任何内容。
我还想确保如果有人获得了机器的根访问权限,但没有解密密钥,他们就无法读取数据。
我该怎么做?这样做有意义吗?我担心如果有人有权访问 mysql 数据库,他们必然会访问密钥,所以这没有意义。我遗漏了什么吗?
答案1
最低限度的字段级 AES 和 DES 加密可用:https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_encrypt
没有人能够在没有为每个查询指定键(或没有将其添加到触发器/过程)的情况下读取数据。
例子:
插入:
INSERT INTO users (username, password) VALUES ('root', AES_ENCRYPT('somepassword', 'key12346123'));
并选择:
SELECT AES_DECRYPT(password, 'key12346123') FROM users WHERE username = 'root';
此外,需要与数据库的 SSL 连接。
在较低级别上,您也可以加密文件系统。
答案2
MariaDB 最近为 InnoDB 和 XtraDB 表添加了表级加密。 https://mariadb.com/kb/en/mariadb/data-at-rest-encryption/#specifying-what-tables-to-encrypt
MySQL 还支持 InnoDB 的表级加密。 https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace-encryption.html
答案3
首先:您将密钥与应用程序一起存储,并在应用程序层处理所有加密。
接下来:确保 MySQL 实例和应用程序 [服务器] 位于不同的机器上,这样 MySQL 服务器上的根权限泄露就不会允许攻击者从应用程序源读取密钥。
这种方法似乎有些过度。妥善处理敏感数据(密码、信用卡等),但加密所有内容则有些过度。(而且在主密钥领域可能适得其反)