什么是摘要认证?
Posted
技术标签:
【中文标题】什么是摘要认证?【英文标题】:What is digest authentication? 【发布时间】:2011-01-23 23:06:21 【问题描述】:除了以纯文本形式发送凭据之外,摘要式身份验证与基本身份验证有何不同?
【问题讨论】:
@Gumbo 的精彩解释就在这里:***.com/a/5288679/591487 你永远不应该使用的东西。不保护传输中的密码,并要求服务器以明文形式存储密码。 Digest 确实为未加密流量提供了比基本身份验证更好的传输安全性,但它很弱。将基本身份验证与 SSL/TLS 结合使用会更安全,因为这样您还可以保持服务器上的密码加密。 使用 TLS 的用户摘要认证实际上要好得多。这样您就不会将密码泄露给网络钓鱼网站。如果他们使用安全的散列算法会更好。 【参考方案1】:主要区别在于它不需要以明文形式通过网络发送用户名和密码。它也不受重放攻击,因为它使用来自服务器的一次性号码。
服务器给客户端一个一次性使用编号(一个随机数),它与用户名、领域、密码和 URI 请求结合在一起。客户端通过 MD5 散列方法运行所有这些字段以生成散列键。
它将这个散列密钥连同用户名和领域一起发送到服务器以尝试进行身份验证。
服务器端使用相同的方法生成哈希键,只是服务器不使用在浏览器中输入的密码,而是从其用户数据库中查找用户的预期密码。它查找该用户名的存储密码,通过相同的算法运行并将其与客户端发送的密码进行比较。如果它们匹配,则授予访问权限,否则它可以发送回 401 Unauthorized(未登录或登录失败)或 403 Forbidden(访问被拒绝)。
摘要式身份验证是standardized in RFC2617。有一个nice overview of it on Wikipedia:
你可以这样想:
-
客户提出请求
客户端从服务器取回一个 nonce 和一个 401 身份验证请求
客户端发回以下响应数组(username, realm, generate_md5_key(nonce, username, realm, URI, password_given_by_user_to_browser))(是的,非常简单)
服务器获取用户名和领域(加上它知道客户端请求的 URI)并查找该用户名的密码。然后它会执行自己的 generate_md5_key(nonce, username, realm, URI, password_I_have_for_this_user_in_my_db) 版本
它会将其得到的 generate_md5() 输出与客户端发送的输出进行比较,如果它们匹配客户端发送的正确密码。如果他们不匹配发送的密码是错误的。
【讨论】:
很好的解释。用户名和密码是 Windows 用户的吗?它们是从哪里生成的? 它们是用户在浏览器中输入的任何内容。密码需要与服务器为该用户存储的密码相匹配。它很可能是特定于该 Web 应用程序的东西,而不是您的 Windows 密码。这在很大程度上取决于 Web 应用程序的组合方式。 这个答案已有 6 年历史,但我猜现在所有安全意识系统都以盐渍哈希格式存储密码。没有也不应该有任何从数据库中获取原始密码的方法,这使得摘要授权是不可能的。 如果用户名和密码的摘要哈希存储在数据库中而不是普通密码中,那么仍然可以使用摘要身份验证@RamondeKlein @BlueBockser 我认为 karakays 的意思是,不是使用普通密码,而是在注册时将用户名和密码结合的 hash 存储在服务器中,并且在验证之前在客户端计算。也可以只用密码的哈希值来完成。【参考方案2】:通过网络发送凭据的哈希值。
HA1 = MD5(username:realm:password)
Wikipedia has an excellent article on this topic
【讨论】:
【参考方案3】:获取凭据的哈希 HA1 的唯一方法是知道密码。服务器知道 HA1,但不知道生成它的密码。如果攻击者知道 HA1,它就可以进入系统。所以它不会通过电线发送。在此之前基于 nonce 等进行进一步的散列,这必须与在服务器上进行的类似计算一致。因此,只要服务器保持 HA1 私有,系统就是安全的。
【讨论】:
这是对Digest身份验证的解释,其中密码不是以纯文本形式发送的(Basic Auth就是这种情况)以上是关于什么是摘要认证?的主要内容,如果未能解决你的问题,请参考以下文章
http协议之digest(摘要)认证,详细讲解并附Java SpringBoot源码