2

Wikipedia提供了以下基于 nonce 的身份验证示例:

  1. 客户端从服务器请求随机数。

  2. 服务器以随机数响应(即,以下称为“服务器随机数”)。

  3. 客户端使用服务器随机数、它自己的客户端随机数和用户输入的密码来生成哈希。

  4. 客户端将用户输入的用户名、客户端随机数和哈希发送到服务器。

  5. 服务器从其数据库中检索服务器随机数和用户密码,大概是通过用户名。

  6. 服务器结合服务器随机数、客户端随机数和密码来生成哈希。

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

  8. 如果哈希匹配,则客户端通过身份验证。如果没有,客户将被拒绝。

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

4

1 回答 1

9

该协议基本上是一个质询-响应身份验证。它用于避免发送实际的秘密(例如密码),但只有在知道秘密的情况下响应才有效。并且为了避免重放攻击,加入了一个随机数。

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

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

  1. 客户端向服务器请求用户输入的用户名的salt和 nonce 。
  2. 服务器从它的数据库中检索盐,大概是通过用户名,并用盐和随机数(即,以下称为服务器随机数)进行响应。
  3. 客户端使用salt和用户输入的密码生成密码散列,并使用密码散列服务器随机数和它自己的客户端随机数生成随机数散列
  4. 客户端将用户输入的用户名客户端随机数随机数哈希发送到服务器。
  5. 服务器从其数据库中检索服务器随机数和用户密码哈希,大概是通过用户名
  6. 服务器结合服务器随机数客户端随机数密码散列来生成随机数散列
  7. 服务器将刚刚生成的随机数哈希客户端发送的随机数哈希进行比较。
  8. 如果哈希匹配,则客户端通过身份验证。如果没有,客户将被拒绝。
于 2014-07-27T07:40:12.910 回答