Security 登录期间是否应使用nonce?

Security 登录期间是否应使用nonce?,security,authentication,login,hash,nonce,Security,Authentication,Login,Hash,Nonce,显示以下基于nonce的身份验证示例: 客户端从服务器请求nonce 服务器以nonce(即,以下简称“服务器”)响应 暂时”) 客户端使用服务器nonce、它自己的客户端nonce和用户输入的nonce 生成哈希的密码 客户端将用户输入的用户名、客户端nonce和哈希发送到 服务器 服务器从其数据库中检索服务器nonce和用户密码 数据库,大概是通过用户名 服务器将服务器nonce、客户端nonce和密码组合到 生成一个散列 服务器将刚刚生成的哈希与从客户端发送的哈希进行比较 如果哈希匹配,则

显示以下基于nonce的身份验证示例:

  • 客户端从服务器请求nonce

  • 服务器以nonce(即,以下简称“服务器”)响应 暂时”)

  • 客户端使用服务器nonce、它自己的客户端nonce和用户输入的nonce 生成哈希的密码

  • 客户端将用户输入的用户名、客户端nonce和哈希发送到 服务器

  • 服务器从其数据库中检索服务器nonce和用户密码 数据库,大概是通过用户名

  • 服务器将服务器nonce、客户端nonce和密码组合到 生成一个散列

  • 服务器将刚刚生成的哈希与从客户端发送的哈希进行比较

  • 如果哈希匹配,则对客户端进行身份验证。如果不是,则客户端是 拒绝


  • 这是否意味着服务器以纯文本形式存储用户密码?严重违反了安全原则,即建议保存密码的附加哈希而不是实际密码本身?

    该协议基本上是一种安全协议。它用于避免发送实际的秘密(例如密码),但响应只能在知道秘密的情况下有效。为了避免重放攻击,合并了nonce

    然而,上述协议要求服务器以可检索的形式(例如,明文或加密)存储秘密

    但您可以通过要求客户端生成相同的密码散列来更改协议,以允许使用密码散列而不是明文密码:

  • 客户端从服务器请求用户输入的用户名的salt和nonce
  • 服务器可能通过用户名从其数据库中检索salt,并使用salt和nonce(即,以下称为服务器nonce)进行响应
  • 客户端使用salt和用户输入的密码生成密码哈希,并使用密码哈希、服务器nonce和它自己的客户端nonce生成nonce哈希
  • 客户端将用户输入的用户名、客户端nonce和nonce散列发送到服务器
  • 服务器从其数据库中检索服务器nonce和用户密码散列,可能是通过用户名
  • 服务器将服务器nonce、客户端nonce和密码哈希组合起来生成nonce哈希
  • 服务器将刚刚生成的nonce哈希与从客户端发送的nonce哈希进行比较
  • 如果哈希匹配,则对客户端进行身份验证。如果不是,则拒绝客户端

  • 这个协议基本上是一个协议。它用于避免发送实际的秘密(例如密码),但响应只能在知道秘密的情况下有效。为了避免重放攻击,合并了nonce

    然而,上述协议要求服务器以可检索的形式(例如,明文或加密)存储秘密

    但您可以通过要求客户端生成相同的密码散列来更改协议,以允许使用密码散列而不是明文密码:

  • 客户端从服务器请求用户输入的用户名的salt和nonce
  • 服务器可能通过用户名从其数据库中检索salt,并使用salt和nonce(即,以下称为服务器nonce)进行响应
  • 客户端使用salt和用户输入的密码生成密码哈希,并使用密码哈希、服务器nonce和它自己的客户端nonce生成nonce哈希
  • 客户端将用户输入的用户名、客户端nonce和nonce散列发送到服务器
  • 服务器从其数据库中检索服务器nonce和用户密码散列,可能是通过用户名
  • 服务器将服务器nonce、客户端nonce和密码哈希组合起来生成nonce哈希
  • 服务器将刚刚生成的nonce哈希与从客户端发送的nonce哈希进行比较
  • 如果哈希匹配,则对客户端进行身份验证。如果不是,则拒绝客户端

  • 美好的我想到了客户机本身的散列,但随后又担心通过网络发送散列密码(即服务器数据库中的值)。您的技术解决了这个问题。非常好的解释,但有一点需要注意:我不建议客户机立即将
    服务器发送回来。这将允许中间人攻击,因为他可以只替换nonce,而如果服务器存储它直到客户端响应,则无法在服务器端修改nonce,现在如果在通信过程中修改了nonce,则nonce哈希将不匹配(因为客户端和服务器上的nonce将不同)@Gumbo此方法存在的问题是服务器没有对
    passhash
    进行任何进一步的哈希运算,因此任何有权访问数据库的人都可以使用存储的
    passhash
    生成
    nonce hash
    ,并成功登录。只需遵循合法登录过程,但使用检索到的
    密码哈希
    ,而不是从用户输入生成密码。这就是为什么只有
    客户端哈希
    被认为是不安全的。如果您还可以添加
    服务器端哈希
    ,此方法将几乎完美。将
    服务器端哈希
    添加到此算法的问题是,您必须同时发送
    passhash
    nonce哈希
    ,因此,服务器可以使用
    服务器salt
    passhash
    进行散列,并将其与存储的
    服务器salt散列passhash
    进行比较。
    noncehash
    将仅用于防止回复攻击,而不是用于实际登录过程。如果您有权访问SSL(如HTTPS),这已经包括在内,这使得
    nonce在这种方法中毫无用处。我想到了客户机本身的散列,但随后又担心通过网络发送散列密码(即服务器数据库中的值)。您的技术解决了这个问题。非常好的解释,但有一点需要注意:我不建议客户机立即将
    服务器发送回来。这将允许一名男子在中间攻击,因为他可以重赛