验证并签署HTTP请求

del*_*bel 8 security authentication encryption http

我正在寻找关于HTTP请求的身份验证和签名(完整性检查)的最佳实践的一些指导/意见.我对于使用的语言和技术相当开放,但基本参数和要求如下:

  • 需要身份验证和完整性检查.
  • 该请求包含敏感数据并将通过HTTPS传递,但我无法假设攻击者无法在HTTPS加密(在客户端由某些非法安装的软件)或服务器端嗅探请求例如,通过位于HTTPS端点和实际服务器之间的嗅探器.HTTPS加密/解密处理已传递给外部负载均衡器,因此攻击者可以在负载均衡器和服务器之间插入嗅探器.
  • 我需要确保交易不能伪造.
  • 我需要确保无法重播交易.
  • 请求可以是GET或POST,因此任何额外数据都需要保持在GET请求的最大大小限制内.

我们考虑过的事情:

  • 每个请求的用户名/密码.这保证了我认为的身份验证,但如果攻击者可以嗅探用户名/密码对,那么一切都会失败.
  • 每个请求的私钥签名.服务器将具有公钥,只有客户端将具有私钥.这保证了完整性,因为只有客户端可以生成签名,但服务器可以检查签名.它通常也保证身份验证,因为私钥不是请求数据的一部分,不能被嗅探.但是,它本身并不会停止重放事务,因为具有相同数据的2个事务将具有相同的签名.
  • 使用加密客户端随机数(https://en.wikipedia.org/wiki/Cryptographic_nonce)作为请求数据的一部分,并将其包含在要签名的数据中.我们遇到了这些问题,特别是当它们是在客户端生成时,因为如果它们不是足够随机的,那么攻击者可以找出它们是如何生成的,然后攻击者可以生成一系列自己的nonce.客户端生成相同的序列,这可能导致拒绝服务攻击,因为客户端将尝试重新使用已经被攻击者使用的nonce.已经考虑在服务器端生成随机数,但这是一个额外的事务,可能是性能问题.
  • 在请求数据中包含日期/时间,但这可能会导致客户端时钟和服务器时钟偏离同步的问题.

如果某些管理员决定将此标记为重复,那么我认为其他Q不能完全解决此问题的全部范围:

Sil*_*Fox 5

假设客户端和服务器之间是 1-1 关系,带有计数器的 HMAC 将解决这个问题。

客户端和服务器有一个共享的 128 位密钥。

客户端发送的消息具有带有密钥的 HMAC 和一个计数器。建议使用 SHA-256,因为 SHA-1 即将淘汰(SHA-1 HMAC 仍然被认为是安全的,但这是另一回事)。

例如

example.com?message=foo&counter=1&hmac=35ed8c76e7b931b06f00143b70307e90f0831682e7bdce2074ebb5c509d16cfb`
Run Code Online (Sandbox Code Playgroud)

(此工具用于此帖子并带有 secret bar。)

HMAC 是通过 计算的message=foo&counter=1。

现在,一旦 HMAC 已被服务器验证并检查计数器,服务器的计数器就会增加到 2。现在服务器将不接受任何计数器小于 2 的已验证消息。

可以使用JSON Web 令牌,以便您以标准格式执行上述操作。您可以对多个客户端执行上述操作,但是您需要跟踪每个客户端的计数器服务器端,并且客户端必须在消息中标识自己。如果您决定为每个客户端使用不同的密钥,则管理共享机密是最棘手的部分。