Я знаю, что могу зашифровать определенные поля базы данных, но я заинтересован в шифровании каждого поля базы данных. Я хочу быть уверенным, что никто, кто получает доступ к оболочке mysql, но не имеет доступа к ключу дешифрования, не может вообще ничего читать из базы данных.
Я также хочу убедиться, что если кто-то получил root-доступ к машине, но не имел ключа дешифрования, он не мог прочитать данные.
Как мне это сделать? Есть ли смысл делать? Меня беспокоит, что если у кого-то есть доступ к базе данных mysql, он неизбежно получит доступ к ключу, так что это не имеет смысла. Я что-то упускаю?
Доступно минимальное шифрование 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-соединение с базой данных.
И на более низком уровне - вы тоже можете зашифровать файловую систему.
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 не позволил злоумышленнику прочитать ключ из источника приложения.
Такой подход кажется чрезмерным. Правильно обрабатывайте конфиденциальные данные (пароли, кредитные карты и т. Д.), Но шифрование всего излишне. (И, вероятно, контрпродуктивно в мире первичных ключей)