我知道我可以加密数据库的特定字段,但我对加密数据库的每个字段感兴趣。我想确保没有人可以访问 mysql shell 但无权访问解密密钥,根本无法从数据库中读取任何内容。
我还想确保如果有人获得了对机器的 root 访问权限,但没有解密密钥,他们就无法读取数据。
我该怎么做?这样做有意义吗?我担心如果有人可以访问 mysql 数据库,他们不可避免地会访问密钥,所以这是没有意义的。我错过了什么吗?
Gio*_*Mac 10
可以使用最小的字段级 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'));
Run Code Online (Sandbox Code Playgroud)
并选择:
SELECT AES_DECRYPT(password, 'key12346123') FROM users WHERE username = 'root';
Run Code Online (Sandbox Code Playgroud)
此外,这需要到数据库的 SSL 连接。
在较低级别 - 您也可以加密文件系统。
小智 8
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
第一:您将密钥存储在应用程序中,并在应用程序层处理所有加密。
接下来:确保 MySQL 实例和应用程序 [服务器] 位于不同的计算机上,以便 MySQL 服务器上的 root 攻击不允许攻击者从应用程序源读取密钥。
这种做法似乎有些过分了。正确处理敏感数据(密码、信用卡等),但对所有内容进行加密就有点矫枉过正了。(并且在主键世界中可能会适得其反)