我被要求查看是否可以在处理请求期间解密标头。
具体用例是通过从请求中删除另一个标头来响应标头的解密内容(如果解密数据不“正确”)。加密标头中的数据用于验证客户端的各个方面。
我知道如何使用带有未加密标头值的 mod_headers 轻松完成此操作,但我无法找到有关获取标头、解密标头并使用结果值的任何信息。
是我遗漏了什么还是这根本就不可行?
答案1
您可以使用 mod_rewrite 来实现这一点。例如,假设 /path/to/decryption/script 是一个脚本,它在其标准输入上接受加密的标头值,并根据该值是否正确输出“good”或“bad”。
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
并让脚本将这些值分开。参见重写条件以获取可使用的值类型的列表。
外部程序必须在每次收到新请求时运行,因此如果处理每行新内容的速度很慢,性能可能会很差。
请参阅“外部重写程序”RewriteMap 文档了解使用外部重写程序时要注意的其他问题的列表。
答案2
这应该是一条评论,但是有点长。
您的问题中没有提到很多因素,这些因素对于任何解决方案的结构都至关重要,更不用说实施的细节了。您尚未意识到这一点,这让人怀疑您提供的信息的准确性,以及您理解问题并解决问题的能力。
但是,给你一个怀疑的好处……
除了加密密钥之外,您还需要加密算法、初始化向量和有效负载的编码。
您应该已经知道 Apache 无法解密数据,这意味着您需要将数据发送到其他地方,但这又引出了一个问题:您想要实现什么。标头只是消息的附属物,还是消息就在标头中。如果是后者,那么系统为什么要这样设计呢?
您似乎试图独立于请求的处理来验证请求,这意味着 mitm 代理操作。这反而引出了一个问题,为什么您要在 Apache 中解决这个问题,尽管它可以作为代理运行,但它主要是原始服务器。
例如,您可以将请求直接发送到 php 脚本并使用 mcrypt 或 openssl 解密相关标头,然后向实际目标创建新请求,但还有很多其他方法可以解决问题,并且这种方法并不适用于所有可能的情况。