Меня попросили посмотреть, можно ли расшифровать заголовок во время обработки запроса.
Конкретный вариант использования - ответить на расшифрованное содержимое заголовка путем удаления другого заголовка из запроса (если расшифрованные данные не «правильные»). Данные в зашифрованном заголовке используются для проверки аспектов клиента.
Я вижу, как это можно легко сделать, используя mod_headers с незашифрованным значением заголовка, но я не смог найти ничего, беря заголовок, расшифровывая его и используя полученное значение.
Я что-то упустил или это просто невозможно?
Вы можете сделать это с помощью mod_rewrite. Например, предположим, что / path / to / decryption / script - это сценарий, который принимает зашифрованное значение заголовка на свой стандартный ввод и выводит либо «хорошо», либо «плохо» в зависимости от того, в порядке ли значение.
RewriteEngine on
RewriteMap decryptmap ext:/path/to/decryption/script
# Set environment variable BAD_RESULT if the header decryption fails
RewriteCond %{decryptmap:%{HTTP:Header-to-decrypt}} bad
RewriteRule .* - [E=BAD_RESULT]
# Clear a header if the decryption failed
Header unset Header-to-clear env=BAD_RESULT
Вы также можете включить другие данные в стандартный ввод для сценария. Например:
RewriteCond %{decryptmap:%{HTTP:Header-to-decrypt}_%{ENV:varname}_%{HTTP:Another-header}} bad
и пусть сценарий разделит значения. Видеть RewriteCond для списка типов значений, которые вы можете использовать.
Внешняя программа должна будет запускаться при каждом новом запросе, поэтому производительность может быть плохой, если она медленно обрабатывает каждую новую строку.
См. «Внешняя программа перезаписи» в Документация RewriteMap список других проблем, на которые следует обратить внимание при использовании внешних программ перезаписи.
Это должен быть комментарий, но он довольно длинный.
Существует множество факторов, которые вы не рассмотрели в своем вопросе, которые имеют решающее значение для структуры любого решения, не говоря уже о специфике реализации. То, что вы еще не знаете об этом, ставит под сомнение точность предоставленной вами информации, вашу способность понять проблему и, следовательно, решить ее.
Но если вы сомневаетесь ...
В дополнение к ключу шифрования вам потребуются алгоритм шифрования, вектор инициализации и кодировка полезной нагрузки.
Вы уже должны знать, что Apache не может расшифровать данные, то есть вам нужно отправить данные в другое место, но тогда возникает вопрос о том, чего вы пытаетесь достичь. Является ли заголовок просто дополнением к сообщению или является сообщением в заголовке. Если последнее, то почему система устроена таким образом?
Похоже, вы пытаетесь аутентифицировать запрос независимо от обработки запроса, что подразумевает операцию прокси-сервера mitm. Что, скорее, вызывает вопрос, почему вы пытаетесь решить эту проблему в Apache, который, хотя и может работать как прокси, в первую очередь является исходным сервером.
Вы можете, например, направить запрос в php-скрипт и использовать mcrypt или openssl для расшифровки соответствующего заголовка, а затем создать новый запрос к фактической цели, но есть много других способов решения проблемы, и этот подход неприменим к все возможные сценарии.