摘要认证是什么?

138

除了以明文形式发送凭据外,摘要认证与基本认证有何不同?


1
这里有@Gumbo的很好的解释:https://dev59.com/2G435IYBdhLWcg3wqB4x#5288679 - inorganik
3
永远不要使用以下内容。它无法保护密码在传输过程中的安全,并且需要服务器以明文形式存储密码。 - CodesInChaos
3
摘要相对于基础认证提供了更好的中途安全性,但它仍然不够强大。最安全的方式是使用SSL/TLS结合基础认证,因为这样可以将密码存储在服务器上并加密。 - rustyx
最好使用TLS的摘要认证。这样,您就不会将密码提供给钓鱼网站。如果他们使用安全哈希算法会更好。 - Tuntable
3个回答

231

主要区别在于它不需要以明文形式通过网络发送用户名和密码。此外,由于使用了服务器的一次性数字,它也可以抵御重放攻击。

服务器会给客户端一个一次性使用的数字(nonce),然后将它与用户名、领域、密码和URI请求组合起来。客户端会对这些字段应用MD5哈希方法生成哈希键。

客户端会将此哈希键连同用户名和领域一起发送到服务器以尝试进行身份验证。

服务器使用相同的方法生成哈希键,但是它会从用户数据库中查找期望用户的密码,而不是使用浏览器中输入的密码。它会查找存储在该用户名下的密码,对其运行相同的算法,并将其与客户端发送的内容进行比较。如果匹配,则授予访问权限;否则,它可以发送401未经授权(未登录或登录失败)或403禁止访问(拒绝访问)。

Digest认证已经在RFC2617中标准化。关于它有一个很好的维基百科概述

你可以这样理解它:

  1. 客户端发出请求
  2. 客户端从服务器得到一个随机数和401身份验证请求
  3. 客户端发送以下响应数组(用户名、领域、generate_md5_key(nonce、用户名、领域、URI、用户在浏览器中提供的密码))(是的,这很简化)
  4. 服务器使用用户名和领域(加上它知道客户端正在请求的URI),查找该用户名的密码。然后它进行自己版本的generate_md5_key(nonce、用户名、领域、URI、我在我的数据库中为此用户拥有的密码)
  5. 它将生成的generate_md5()的输出与客户端发送的输出进行比较,如果它们匹配,则客户端发送了正确的密码。如果它们不匹配,则发送的密码错误。

1
它们是用户在浏览器中输入的任何内容。密码需要与服务器为该用户存储的密码匹配。很可能这是特定于该Web应用程序的,而不是您的Windows密码。这非常取决于Web应用程序的构建方式。 - Ian C.
26
这个回答已经有6年了,但我猜现在所有安全意识系统都会以盐哈希格式存储密码。从数据库中获取原始密码的方法是不存在的,也不应该存在,这使得摘要授权变得不可能。 - Ramon de Klein
6
如果在数据库中存储的是用户名和密码的摘要哈希值而不是明文密码,则仍然可以使用摘要认证。@RamondeKlein - karakays
1
@BlueBockser 我认为karakays的意思是,在注册时,应该将用户名和密码组合后生成的_hash_存储在服务器上,并在客户端进行身份验证之前计算。也可以只使用密码的哈希值来实现。 - logo_writer
@RamondeKlein 盐值处理密码如何对抗网络钓鱼攻击呢?这种攻击是目前最为常见的一种。如果摘要认证 + TLS 使用了一种安全哈希算法,也可以消灭网络钓鱼攻击。 - Tuntable
显示剩余2条评论

17

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

这是摘要认证的解释,其中密码不以明文形式发送(这是基本认证的情况)。 - Erik Oppedijk
HTTP头部在使用SSL时是加密的。 - DarkNeuron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接