我正在寻求关于如何对HTTP请求进行身份验证和签名(完整性检查)的最佳实践建议。语言和技术方面比较开放,但基本参数和要求如下:
- 需要进行身份验证和完整性检查。
- 请求包含敏感数据并将通过HTTPS传递,但不能假定请求无法被攻击者嗅探到,无论是在HTTPS加密之前(在客户端端由某些非法安装软件)还是在服务器端,例如通过放置在HTTPS端点和实际服务器之间的嗅探器。 HTTPS加密/解密处理已经被外部负载均衡器接管,因此攻击者可以在负载均衡器和服务器之间插入嗅探器。
- 需要确保交易不能被伪造。
- 需要确保交易不能被重复播放。
- 请求可以是GET或POST方法,因此任何额外的数据都需要保持在GET请求的最大大小限制内。
我们考虑过以下内容:
- 每个请求的用户名/密码。这应该可以保证身份验证,但如果攻击者能够嗅探到用户名/密码对,则所有内容都将失败。
- 每个请求的私钥签名。服务器将拥有公钥,只有客户端将拥有私钥。这可以保证完整性,因为只有客户端才能生成签名,但服务器可以检查签名。它通常也可以保证身份验证,因为私钥不是请求数据的一部分,无法被嗅探到。但单独使用它不能防止交易被重复播放,因为具有相同数据的2个交易将具有相同的签名。
如果某个管理员决定将其标记为重复项,则以下是我考虑过但不完全解决此问题范围的其他问题: