在邮件请求正文中的Json对象中发送用户名和密码是否安全?

时间:2017-07-27 08:21:28

标签: json security passwords

我正在构建一个Web应用程序,我的Web服务器是安全的,这意味着它使用前端的ssl证书来加密连接。

当用户登录时,会创建一个看起来像这样的JSON对象,并将其发送到服务器。

{
    username:"the user's username",
    password:"the user's password"
}

在服务器上,使用使用salt的散列算法验证。一旦验证,就会创建一个有效一段时间的api令牌,并在标头中来回传递,以便在发出请求时验证用户。是发送这样的最佳做法/安全的用户名和密码,还是最好在标题中发送?

2 个答案:

答案 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)然后使用仅为您的服务器知道的私钥在目的地解密它。在这种情况下,您无需过多担心传输中的邮件会发生什么。