2010-03-05 67 views
68

摘要式身份验证与基本身份验证有什么不同,除了以纯文本形式发送凭据外?什么是摘要认证?

+0

@Gumbo伟大的解释就在这里:http://stackoverflow.com/a/5288679/591487 – inorganik

+2

一些你永远不应该使用的东西。不保护传输中的密码并要求服务器以普通的方式存储密码。 – CodesInChaos

+1

摘要确实提供比传输安全性更好的传输安全性,但它很弱。使用基本身份验证与SSL/TLS结合使用会更安全,因为这样您也可以将服务器上的密码加密。 – rustyx

回答

112

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

服务器向客户端提供与用户名,域,密码和URI请求相结合的一次性使用号码(随机数)。客户端通过MD5哈希方法运行所有这些字段以生成哈希键。

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

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

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

你可以认为它像这样:

  1. 客户端发出请求
  2. 客户回来从服务器现时和401的认证请求
  3. 客户端返回以下响应数组(用户名,领域,generate_md5_key(随机数,用户名,realm,URI,password_given_by_user_to_browser))(是的,这是非常简化)
  4. 服务器接受用户名和领域(加上它知道客户端请求的URI),它厕所k取得该用户名的密码。然后它自动执行generate_md5_key(nonce,username,realm,URI,password_I_have_for_this_user_in_my_db)
  5. 它将generate_md5()的输出与客户端发送的输出进行比较,如果它们与客户端发送的正确匹配密码。如果它们不匹配,则发送的密码错误。
+0

很好的解释。是Windows用户的用户名和密码?他们从哪里产生? – SoftwareGeek

+0

它们是用户输入到浏览器中的任何内容。密码需要与服务器为该用户密码存储的任何内容匹配。更有可能的是,这是特定于该Web应用程序的东西,而不是您的Windows密码。它非常依赖于Web应用程序的组合方式。 –

+7

这个答案已经有6年了,但我猜所有安全感知系统现在都会将密码以salted-hash格式存储。没有,也不应该有任何方法从数据库中获得原始密码,使得摘要授权变得不可能。 –

10

凭证的哈希通过线路发送。

HA1 = MD5(username:realm:password) 

Wikipedia has an excellent article on this topic

+0

从客户端到服务器?您能否提供相互作用的步骤? 维基百科文章很好,但我需要更好的解释或例子。 – SoftwareGeek

+0

是的客户端生成散列值并将其发送到服务器。维基百科的文章详细描述了协议,我建议你参考一下以获取更多信息。 –

1

获取证书哈希值HA1的唯一方法是知道密码。服务器知道HA1但不知道生成它的密码。如果攻击者知道HA1可以进入系统。所以它不会被发送出去。基于nonce等的进一步散列在完成之前完成,并且这必须与在服务器上完成的类似计算一致。因此,只要服务器保持HA1私密,系统就是安全的。

+0

这是摘要式身份验证的解释,其中密码不是以纯文本形式发送的(基本身份验证是这种情况) –