
Я знаю, что могу зашифровать отдельные поля базы данных, но мне интересно зашифровать каждое поле базы данных. Я хочу быть уверенным, что никто, получивший доступ к оболочке mysql, но не имеющий доступа к ключу дешифрования, не сможет прочитать что-либо из базы данных.
Я также хочу убедиться, что если кто-то получит root-доступ к машине, но не будет иметь ключа дешифрования, он не сможет прочитать данные.
Как мне это сделать? Имеет ли это смысл? Я обеспокоен тем, что если кто-то имеет доступ к базе данных 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/#указание-каких-таблиц-шифровать
MySQL также поддерживает шифрование на уровне таблиц для InnoDB. https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace-encryption.html
решение3
Первое: вы храните свой ключ в приложении и управляете всем шифрованием на уровне приложения.
Далее: вы обеспечиваете, чтобы экземпляр MySQL и приложение [сервер] находились на разных машинах, чтобы взлом root-доступа к серверу MySQL не позволил злоумышленнику прочитать ключ из исходного кода приложения.
Такой подход кажется чрезмерным. Обрабатывайте конфиденциальные данные должным образом (пароли, кредитные карты и т. д.), но шифрование всего — это излишество. (И, вероятно, контрпродуктивно в мире первичных ключей)