摘要认证和基本认证有什么区别?

258
Digest 认证和 Basic 认证有什么区别?
4个回答

267
摘要认证通过将哈希函数应用于用户名、密码、服务器提供的随机值、HTTP方法和请求的URI来以加密形式传递凭据。
而基本身份验证使用非加密的base64编码。
因此,基本身份验证通常只应在提供传输层安全性(如https)时使用。
有关所有详细信息,请参见RFC-2617

1
基本身份验证是如何未加密的?我使用了这个网站来解码用户名和密码数据http://www.base64decode.org/。 - Dot Freelancer
88
编码和加密不是同一回事。使用该网站能够解码凭证表明它们并没有被加密。 - Andy
2
@Andy,“解码凭据”是什么意思?哈希的凭据无法被解码... - Alexander Suraphel
16
没错,基本认证不使用哈希凭据,它们是经过Base64编码的。 - Andy
1
@DotFreelancer 简单来说,加密需要使用特定方法解密的密钥,而编码只需要方法即可。如果接收到加密信息的人没有密钥,则无法恢复(解密)该消息。 - Nguyen H Chan

166

HTTP基本访问认证

  • 步骤1:客户端发送明文用户名和密码的请求以获取信息
  • 步骤2:服务器响应所需的信息或错误

基本认证使用base64编码(而非加密)生成包含用户名和密码信息的加密字符串。HTTP基本认证不需要在SSL上实现,但如果不这样做,它就不安全。因此,我甚至不会考虑在没有SSL的情况下使用它。

优点:

  • 易于实现,因此您的客户端开发人员将有更少的工作量和更短的交付时间,因此开发人员更可能想要使用您的API
  • 与摘要不同,您可以在服务器上以任何加密方法(如bcrypt)存储密码,从而使密码更安全
  • 只需要一次调用服务器即可获取信息,使客户端比更复杂的身份验证方法稍快

缺点:

  • SSL 运行速度比基本的 HTTP 慢,这会使客户端稍微慢一些
  • 如果您无法控制客户端,并且无法强制服务器使用 SSL,则开发人员可能不使用 SSL,从而导致安全风险

简而言之 - 如果您可以控制客户端或确保他们使用 SSL,则 HTTP 基本身份验证是一个不错的选择。 SSL 的缓慢可以通过只发出一个请求的速度来抵消。

基本认证语法

Value = username:password
Encoded Value = base64(Value)
Authorization Value = Basic <Encoded Value> 
// at last Authorization key/value map added to http header as follows
Authorization: <Authorization Value>

HTTP摘要访问认证
摘要访问认证使用哈希技术(即摘要意味着将数据切成小块)生成加密结果。HTTP摘要访问认证是一种更复杂的身份验证形式,其工作方式如下:

  • 步骤1:客户端向服务器发送请求
  • 步骤2:服务器用一个特殊的代码(称为,即只使用一次的number)和另一个表示领域的字符串(不是特定页面,可以是一组页面,即分区保护空间),要求客户端进行身份验证
  • 步骤3:客户端响应此nonce和加密版本的用户名、密码和领域(哈希值)
  • 步骤4:如果客户端哈希值与服务器自己对用户名、密码和领域的哈希值匹配,则服务器将响应所请求的信息,否则将返回错误

优点:

  • 没有用户名或密码以明文形式发送到服务器,使得非SSL连接比未通过SSL发送的HTTP基本请求更安全。这意味着不需要SSL,每个调用都会稍微快一些。

缺点:

  • 对于每个所需的调用,客户端必须进行2次调用,使得该过程比HTTP基本认证稍微慢一些。
  • HTTP摘要容易受到中间人攻击的威胁,这基本上意味着它可能被黑客攻击。
  • HTTP摘要防止使用强密码加密,这意味着存储在服务器上的密码可能会被黑客攻击。

总之,HTTP摘要本质上容易受到至少两种攻击,而使用HTTP基本认证通过SSL为密码使用强加密的服务器不太可能共享这些漏洞。

然而,如果您无法控制客户端,则他们可能会尝试在没有SSL的情况下执行基本身份验证,这比Digest不安全得多。

RFC 2069摘要访问认证语法

Hash1=MD5(username:realm:password)
Hash2=MD5(method:digestURI)
response=MD5(Hash1:nonce:Hash2)

RFC 2617 摘要访问认证语法

Hash1=MD5(username:realm:password)
Hash2=MD5(method:digestURI)
response=MD5(Hash1:nonce:nonceCount:cnonce:qop:Hash2)
//some additional parameters added 

源代码示例

在Postman中看起来如下:

enter image description here

注意:

  • 基本认证和摘要认证方案专门用于使用用户名和密码进行身份验证。
  • 承载者方案专门用于使用令牌进行身份验证。在BA(基本认证)头中,Bearer token可以被视为授予此令牌的持有人访问权限。

1
在您的Web服务器上,即使您无法控制客户端,是否可以为所有HTTP请求重定向到HTTPS? - 10cool
我越想越明白你的观点。假设他们通过HTTP提交凭据并访问您的网站,您可以进行重定向,但如果他们访问了恶意网站,您无法提供帮助。 - 10cool
3
为什么在使用 Digest 时,不能在将密码存储到数据库之前对其进行加密,并在取出时进行解密? - papiro
虽然所选答案更接近问题,但我喜欢这个答案,因为它为我们这些初学者提供了利弊分析。 - coder0h1t
优秀的回答,准确并解释了利弊。 - Downhillski
我认为你在这个陈述中将digest作为动词与名词形式混淆了。在这个上下文中,digest的意思是信息的摘要,即散列凭证。它并不意味着“切成小块”。 - dovetalk

54

让我们看一下使用 Wireshark(用于分析发送或接收的数据包的工具)来比较两种不同的HTTP身份验证。

1. Http基本身份验证

Basic

客户端输入正确的 用户名:密码,由 Web 服务器请求,然后 Web 服务器检查数据库中的凭据是否正确,并给予对资源的访问权限。

以下是数据包的发送和接收方式:

enter image description here 在第一个数据包中,客户端使用 POST 方法在资源- lab/webapp/basicauth 中填写凭据。作为回应,服务器回复 http 响应代码 200 ok ,即用户名:密码正确。

Detail of HTTP packet

现在,在 Authorization 标头中显示它是基本认证,后跟一些随机字符串。该字符串是凭据 admin:aadd (包括冒号)的编码(Base64)版本。

2. Http Digest身份验证(rfc 2069)

到目前为止,我们已经看到基本身份验证以明文形式在网络上发送用户名:密码。但是Digest身份验证使用哈希算法发送密码的HASH

这里是显示客户端请求和服务器响应的数据包。

摘要

当客户端输入服务器请求的凭据时,使用算法将密码转换为一个响应,然后将其发送到服务器。如果服务器数据库具有与客户端给出的响应相同的响应,则服务器会授予资源访问权限,否则会出现401错误。

详细的摘要认证数据包 在上面的Authorization中,response字符串是使用图像中显示的UsernameRealmPasswordhttp-methodURINonce的值计算的:

响应算法 (冒号已包括在内)

因此,我们可以看到,摘要身份验证更加安全,因为它涉及哈希(MD5加密),因此数据包嗅探工具无法嗅探密码,尽管在基本认证中,确切的密码会显示在Wireshark上。


7
这个答案应该被采纳,因为它更具信息量,并且图表也值得赞赏。 - mak
2
胡说八道。Basic Auth 只应该在 HTTPS 上使用。因此,真正的比较是 Basic Auth 在 HTTPS 上与 Digest Auth 在 HTTP 上。由于现在网站都加密其所有流量,您最好使用 Basic Auth over HTTPS。 - Gili
@Gili 你把加密和认证搞混了。 - BoRRis
@BoRRis,不,他的意思是未加密的密码对于数据包嗅探器来说是不可见的,因为所有流量,包括密码在内,都是通过https进行加密的。 - julaine

-5

基本身份验证使用 64编码 来生成包含用户名和密码信息的加密字符串。

摘要访问身份验证使用哈希方法来生成加密结果。


8
Base 64 编码并非加密算法。 - Thomas Sobieck

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