2016-01-22 308 views
1

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

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

    • 用户名/密码:在我们所考虑

    的事情。这保证了我猜测的身份验证,但是如果攻击者可以嗅探用户名/密码对,那么它全部失败。

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

在某些情况下,管理员决定将此作为一个重复的,这里有其他Qs的,我认为不太解决这一问题的全部范围:

+0

*“我将这个语言和技术用得相当开放”* - 那你为什么要问Stack Overflow?这不再是一个编程问题,如果是,那么它就太宽泛了。 [security.se]会更适合这类问题。 –

回答

1

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

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

客户端发送带有密钥的HMAC消息和计数器。推荐使用SHA-256,因为SHA-1正在推出(尽管SHA-1 HMAC仍被认为是安全的,但这是另一回事)。

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

This tool用于这则讯息秘密bar

的HMAC是在message=foo&counter=1计算。现在

,一旦HMAC已通过服务器的认证和检查柜台,服务器的计数器增加到2现在,服务器将无法与反接受任何身份验证的消息小于2

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

+0

感谢指向JWT的指针,我曾假设有一些标准格式可以做到这一点,但我迄今尚未发现这种格式。我们在客户端和服务器之间有很多关系,但是我们没有那么多的客户端,因此我们无法为每个客户端维护一个不同的密钥(我们有大约15个客户端)。 在此期间,我们决定使用RSA密钥而不是HMAC来实现,但我看到JWT也支持这一点。 – delatbabel

相关问题