验证并签署HTTP请求

时间:2016-01-22 03:03:08

标签: security http authentication encryption

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

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

我们考虑过的事情:

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

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

1 个答案:

答案 0 :(得分:4)

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

客户端和服务器具有共享密钥128位密钥。

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

e.g。

example.com?message=foo&counter=1&hmac=35ed8c76e7b931b06f00143b70307e90f0831682e7bdce2074ebb5c509d16cfb`

This tool用于此帖子的秘密bar。)

HMAC的计算结果为message=foo&counter=1

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

可以使用

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