Хранение ключа AES_ENCRYPT

Это скорее секретный вопрос, касающийся использования AES_ENCRYPT для генерации шифрования данных, вставляемых в базу данных MySQL.

В каком месте лучше всего хранить ключ, используемый для шифрования данных? Явно не в базе! :)


person Neil Young    schedule 03.08.2011    source источник


Ответы (3)


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

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

person Natan    schedule 03.08.2011

Безопасность неизвестностью!

Если ваш веб-сервер скомпрометирован, злоумышленник может получить доступ к ключу, независимо от того, где он хранится, поскольку код должен быть в состоянии найти ключ для выполнения шифрования/дешифрования, и код объясняет, где он находит ключ. Единственный сценарий, в котором это имеет реальную ценность, — это защита данных вне приложения (например, на резервной ленте). Однако, поскольку вы ставите под угрозу способность DBM оптимизировать запросы и создаете гораздо больший объем данных для такой цели, как резервное копирование, имеет смысл шифровать резервную копию или файловую систему, а не отдельные элементы данных.

Даже если вы используете ключи, которые не хранятся в вашем приложении постоянно (например, пароль базовой аутентификации HTTP, передаваемый через SSL), все равно существует много рисков, что данные будут скомпрометированы, и у вас есть проблемы с обменом данными между разными пользователями. .

Чтобы дать разумный ответ, нам нужно знать, какова модель угроз и есть ли у вас внешние ограничения, такие как PCI-DSS.

person symcbean    schedule 03.08.2011
comment
Правильный. Что я обычно делаю, так это поддерживаю двухуровневый ключ, одна половина которого хранится как случайное значение в базе данных, а вторая половина хранится в PHP-скрипте. Если у кого-то есть доступ и к скриптам PHP, и к базе данных, в любом случае больше ничего нельзя сделать. - person Ben; 19.08.2011
comment
Не имеет смысла хранить половину в базе данных den, так как если у кого-то есть доступ к PHP, у него есть доступ и к базе данных. - person mgutt; 16.08.2012

Проблемы безопасного хранения на сервере ключей и паролей, используемых в вашем PHP/Python/другом приложении, связаны не только с сокрытием ключей от злоумышленника, получившего права суперпользователя на вашем сервере, хотя вы можете злоумышленнику, получившему root, сложнее получить к ним доступ, в конце концов это можно сделать.

Однако ключи/пароли могут быть утеряны многими другими способами и поэтому должны быть защищены. Например, если ваше программное обеспечение обновляется из среды разработки, т. е. загружается и извлекается через git сервер, вы не хотите, чтобы ключи включались в виде обычного текста в исходный код. Это даст любому члену вашей команды разработчиков доступ к ним.

Один из вариантов «более безопасного» хранения ключей — настроить их как переменные среды, а затем включить их в свое приложение, обратившись к этой переменной среды вместо того, чтобы иметь ключ в «обычном тексте» в вашем приложении. .

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

Если вы используете веб-сервер Apache, вы также можете установить переменные среды Apache для конфиденциальных ключей/паролей в файле httpd.conf, а затем получить к ним доступ из своего PHP-скрипта. Вы также можете ограничить права доступа к файлу httpd.conf, чтобы только root мог читать/записывать.

// Example use of getenv()
$sensitive_key = getenv("VERY_SENSITIVE_KEY");

// Example use of apache_getenv()
$sensitive_key = apache_getenv("VERY_SENSITIVE_KEY");

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

person I'm Root James    schedule 18.04.2020