我正在构建一个Web应用程序,我的Web服务器是安全的,这意味着它使用前端的ssl证书来加密连接。
当用户登录时,会创建一个看起来像这样的JSON对象,并将其发送到服务器。
{
username:"the user's username",
password:"the user's password"
}
在服务器上,使用使用salt的散列算法验证。一旦验证,就会创建一个有效一段时间的api令牌,并在标头中来回传递,以便在发出请求时验证用户。是发送这样的最佳做法/安全的用户名和密码,还是最好在标题中发送?
答案 0 :(得分:8)
让我们把它分成很多点:
1)您使用有效的SSL证书来保护用户与服务器之间的通信(必须有效)
2)在POST请求正文中发送用户名和密码是最佳做法(绝不使用GET发送敏感信息,如凭据)
3)在HTTP请求和响应标头中发送api令牌是最佳做法(再次绝不使用GET来发送会话令牌等敏感信息)
因此,基于以上几点,似乎此实施中没有风险,但您需要考虑以下几点:
1)如果空闲用户,API令牌的超时时间应该很短。 (5~15分钟是基于申请临界性的平均值)
2) API令牌的长度应为长字符串约。 30~40个字符。
3) API令牌生成必须随机化,难以预测以防止(会话预测攻击)。
希望这对你有所帮助。
答案 1 :(得分:2)
您所描述的内容基本上是 HTTP基本身份验证。
发送这样的最佳做法/安全的用户名和密码,还是最好将其发送到标题中?
从安全角度来看,无论您是在正文中还是在标头中发送凭据,我都无法想到一个很大的区别。基本上无论谁设法阅读明文消息,都可以在两个组件中看到凭据。使用基本身份验证时的常见做法是使用HTTP标头:
Authorization: Basic VGVzdFVzZXI6UGFzc3dvcmQxMjM0
其中VGVzdFVzZXI6UGFzc3dvcmQxMjM0
是您的base64编码凭据。在这种情况下,解码后的字符串为:TestUser:Password1234
重要的是要意识到,在您的情况下,TLS是传输中凭据的唯一保护,因此您必须识别通信通道中可能潜在地暴露明文消息的所有节点。例如,如果您使用的代理将终止TLS,那么这些代理就是MITM攻击的潜在载体。
如果要增加传输中凭据的安全性,可以选择实施非对称端到端加密,以便在客户端使用经过身份验证的公钥加密凭据(例如,签名证书)由受信任的CA)然后使用仅为您的服务器知道的私钥在目的地解密它。在这种情况下,您无需过多担心传输中的邮件会发生什么。