Как безопасно хранить данные в MySQL с помощью AES_ENCRYPT

Мы храним конфиденциальные данные в MySQL, и я хочу использовать AES_ENCRYPT (данные, «мой секретный ключ здесь»), а затем AES_DECRYPT, который прекрасно работает. Мой самый большой вопрос: как мне защитить ключ? Раньше я просто хранил ключ в веб-файле PHP, поэтому что-то вроде:

define("ENCRYPTION_KEY", 'my-secret-key-here');

Однако на самом деле это не работает, поскольку наш сервер MySQL и веб-сервер представляют собой одну и ту же физическую машину, поэтому, если кто-то получит доступ к серверу, он сможет получить как зашифрованные данные, хранящиеся в MySQL, так и ключ.

Любые идеи? Я думаю, что мне нужно переместить ключ на отдельный сервер и прочитать его удаленно. Или как насчет динамической генерации ключа шифрования для каждого фрагмента данных. Например, взять customer_id и запустить на нем md5, а затем использовать его в качестве ключа.


person Justin    schedule 14.01.2011    source источник


Ответы (2)


Поместите секретный ключ в файл, измените владельца файла на того же пользователя, что и веб-сервер. Удалите все разрешения на файл для группы и всех остальных.

В Superuser есть аналогичный вопрос (https://superuser.com/questions/139393/linux-file-permissions-access-control-query) -- Я уверен, что вы могли бы получить лучшую помощь там или просто погуглить для получения дополнительной информации о правах доступа к файлам в системе, в которой вы работаете.

person nedk    schedule 15.01.2011
comment
Не могли бы вы рассказать нам, каковы будут конкретные права доступа к файлам? - person mozgras; 19.06.2013

Пара вариантов:

  1. Сохраните ключ дешифрования в файл с соответствующими разрешениями.
  2. Если вы действительно хотите хранить ключ вне офиса, «смонтируйте» диск с другой машины. Однако вам все равно нужно правильно настроить разрешения.

Суть в том, что мастер-пароль должен быть доступен серверу, а это значит, что его невозможно полностью заблокировать. Лучшее, что вы можете сделать, это установить для него права пользователя/группы и убедиться, что он находится за пределами корневого веб-сайта.

Если вам не нужна возможность декодировать значение обратно в обычный текст (например, если вы просто сравниваете значения, такие как пароль), рассмотрите возможность использования вместо этого хэша.

person soulkphp    schedule 23.04.2011