什么是摘要认证?

时间:2010-03-05 02:41:05

标签: digest-authentication

摘要身份验证与基本身份验证的区别在于如何以纯文本格式发送凭据?

3 个答案:

答案 0 :(得分:139)

主要区别在于它不需要以明文形式通过线路发送用户名和密码。它也不受重放攻击的影响,因为它使用来自服务器的一次性号码。

服务器为客户端提供一次性使用号码(nonce),它与用户名,域名,密码和URI请求相结合。客户端通过MD5散列方法运行所有这些字段以生成散列密钥。

它将此哈希密钥与用户名和领域一起发送到服务器以尝试进行身份验证。

服务器端使用相同的方法生成一个hashkey,而不是使用输入到浏览器的密码,服务器从用户DB中查找用户的预期密码。它会查找此用户名的存储密码,通过相同的算法运行并将其与客户端发送的内容进行比较。如果它们匹配则授予访问权限,否则它可以发回401 Unauthorized(无登录或登录失败)或403 Forbidden(拒绝访问)。

摘要式身份验证为standardized in RFC2617。有一个nice overview of it on Wikipedia

你可以这样想:

  1. 客户提出请求
  2. 客户端从服务器获取一个随机数和一个401身份验证请求
  3. 客户端发回以下响应数组(username,realm,generate_md5_key(nonce,username,realm,URI,password_given_by_user_to_browser))(是的,非常简化)
  4. 服务器获取用户名和域(加上它知道客户端请求的URI),并查找该用户名的密码。然后它继续执行自己的generate_md5_key版本(nonce,username,realm,URI,password_I_have_for_this_user_in_my_db)
  5. 它将generate_md5()的输出与客户端发送的输出进行比较,如果它们与客户端发送的密码匹配。如果它们不匹配,则发送的密码错误。

答案 1 :(得分:11)

凭据的哈希值通过网络发送。

HA1 = MD5(username:realm:password)

Wikipedia has an excellent article on this topic

答案 2 :(得分:1)

获取凭据哈希值HA1的唯一方法是知道密码。服务器知道HA1但不知道生成它的密码。如果攻击者知道HA1,它可以进入系统。所以它不是通过电线发送的。在执行此操作之前,将基于nonce等进行进一步的散列,这必须与在服务器上执行的类似计算一致。因此,只要服务器保持HA1私有,系统就是安全的。