我在寻找关于验证和签名(完整性检查)HTTP请求的最佳实践的一些指导意见。我将使用的语言和技术相当开放,但基本参数和要求如下:对HTTP请求进行身份验证和签名
- 需要验证和完整性检查。
- 该请求包含敏感数据并将通过HTTPS传递,但我不能假定攻击者无法嗅探到请求,无论是在HTTPS加密之前(在客户端由一些非法安装的软件)还是在服务器端,例如通过放置在HTTPS端点和实际服务器之间的嗅探器。 HTTPS加密/解密处理已传递到外部负载平衡器,因此攻击者有一个小窗口可在负载平衡器和服务器之间插入嗅探器。
- 我需要确保交易不能被伪造。
- 我需要确保交易无法重播。
- 请求可以是GET或POST,所以任何额外的数据都需要保持在GET请求的最大大小限制内。对每个请求
- 用户名/密码:在我们所考虑
的事情。这保证了我猜测的身份验证,但是如果攻击者可以嗅探用户名/密码对,那么它全部失败。
- 每个请求的私钥签名。服务器将拥有公钥,只有客户端拥有私钥。这保证了完整性,因为只有客户端可以生成签名,但服务器可以检查签名。它通常也保证认证,因为私钥不是请求数据的一部分,也不能被嗅探。但是,它本身并不会阻止正在重播的事务,因为具有相同数据的两个事务将具有相同的签名。
- 使用加密客户端随机数(https://en.wikipedia.org/wiki/Cryptographic_nonce)作为请求数据的一部分,并将其包含在要签名的数据中。我们遇到过这些问题,尤其是当它们在客户端生成时,因为如果它们不够随机,那么攻击者可以找出它们是如何生成的,那么攻击者就可以生成一系列自己的随机数,客户端生成相同的序列,这可能会导致拒绝服务攻击,因为客户端将尝试重新使用已被攻击者使用的随机数。已经考虑在服务器端生成随机数,但这是额外的事务并且可能是性能问题。
- 在请求数据中包含日期/时间,但是这可能会导致客户端时钟和服务器时钟漂移不同步的问题。
在某些情况下,管理员决定将此作为一个重复的,这里有其他Qs的,我认为不太解决这一问题的全部范围:
- What is the current standard for authenticating Http requests (REST, Xml over Http)?
- Authenticity and Integrity of HTTP Requests
*“我将这个语言和技术用得相当开放”* - 那你为什么要问Stack Overflow?这不再是一个编程问题,如果是,那么它就太宽泛了。 [security.se]会更适合这类问题。 –