Как вы уже знаете, независимо от того, что вы делаете, если ключ доступен для приложения, он, безусловно, будет доступен для вредоносного кода, который получил root-доступ на сервере и, скорее всего, для кода, получившего доступ к UID, под которым работает приложение. Это просто вопрос, насколько это просто.
Купить с вашего приложения не долго, похоже, вам придется принять уровень риска за его пределами.
Ваша идея - использовать какой-то демон, который держит ключи в ОЗУ и может быть запрошен приложением. Это работает, но вы, вероятно, уже понимаете, что если ваше приложение может запросить его, вредоносный код также может запросить его. Если вы выберете этот вариант в любом случае, подумайте об использовании memcached (зачем изобретать колесо?).
Единственный другой вариант, о котором я могу думать, это написать модуль Apache (в C), который загружает секрет во время запуска системы (после чего постоянная копия тайна размонтируется) и расширение PHP (в C), чтобы получить секрет от модуля Apache, который живет в том же процессе. Предполагается, что вы используете PHP как модуль Apache, а не как внешний процесс. Но для меня это звучит как излишество, потому что оно довольно сложно и на самом деле не снимает риск.
Считаете ли вы, что делать с местом подкачки? Вы можете использовать mlock
или аналогичный (на C), чтобы сохранить секрет для записи, если он находится в ограниченном месте, но было бы сложно защитить его таким образом, как только он будет передан интерпретатору PHP. Поэтому вам лучше запустить систему без свопа.
Рассмотрите изменение дизайна, которое ограничит секрет в одном месте в долговременном демоне (возможно, не написанном на PHP) и попросит приложение PHP делегировать криптографические функции, которым нужен доступ к секрету этому демону.
Вы используете php в среде с ограничениями безопасности? С криптографическими ключами? Интересно ... –
Хорошо, что он работает хорошо и передает проверки безопасности, так что смысл в переписывании всего приложения? – DzikiMarian