首页 > 解决方案 > 在 HA 代理中使用 aes_gcm_dec 解密 HTTP 标头

问题描述

我正在尝试使用 HA Proxy aes_gcm_dec转换器,但至少可以说文档很少,而且我在社区中找不到任何使用示例。

我有一个客户端在 HTTP 标头中发送 AES GCM 128 加密消息,如下所示:

curl -H "X-Routing-Key: e4+DM/EkJQl4jAAOxNtDZb4dd5Q=" localhost:8000

我正在使用 HA 代理来解密该标头并以解密的形式将其转发到后端服务器。这是我的前端配置:

http-request set-header X-Routing-Key %[req.hdr(X-Routing-Key),b64dec,aes_gcm_dec(128,4+6ONmgZoNex0arqdTr7bA==,Zm9vb2Zvb29mb29wZm9vbw==,4QMQhILaVLC9oxyB8hGoZA==)]

aead 标签目前在服务器上是硬编码的,基于我为生成加密的秘密而编写的一个简单的 python 脚本。将来它可能会被客户端传递——与随机数相同。另外,请注意b64decaes_gcm_dec 转换器之前的转换器。我不确定它是否需要。我已经尝试了两种方式,但在当前设置中都不起作用。

当我尝试这样做时,HA 代理会默默地失败。标头到达后端时设置为空字符串。即使有详细的调试,HA 代理也不会记录任何内容,但显然有问题。有谁知道我在这里做错了什么?

标签: encryptionhaproxy

解决方案


我已经在 HAProxy 社区 Slack 聊天中提供了这个答案,但如果有人在 Google 上找到这个答案,你可以在 HAProxy 中执行以下操作

http-request set-var(txn.enc) req.hdr(X-Routing-Key),url_dec,b64dec,bytes(32)
http-request set-var(txn.nonce) req.hdr(X-Routing-Key),url_dec,b64dec,bytes(0,16),base64
http-request set-var(txn.aead_tag) req.hdr(X-Routing-Key),url_dec,b64dec,bytes(16,16),base64
http-request set-header X-Routing-Key %[var(txn.enc),aes_gcm_dec(128,txn.nonce,5AbcQVztUg4LYr406puUkw==,txn.aead_tag)]

确保您的 AES 输出包含密文、随机数和 aead 标签。在引用的 Python 中,它会是这样的:

print("X-Routing-Key: %s" % (base64.b64encode(b"".join([aesCipher.nonce, authTag, ciphertext]))).decode('utf-8'))

推荐阅读