HTTP基本访问认证
基本认证使用base64编码(而非加密)生成包含用户名和密码信息的加密字符串。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摘要访问认证是一种更复杂的身份验证形式,其工作方式如下:
优点:
缺点:
总之,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中看起来如下:
注意:
让我们看一下使用 Wireshark
(用于分析发送或接收的数据包的工具)来比较两种不同的HTTP身份验证。
1. Http基本身份验证
客户端输入正确的 用户名:密码,由 Web 服务器请求,然后 Web 服务器检查数据库中的凭据是否正确,并给予对资源的访问权限。
以下是数据包的发送和接收方式:
在第一个数据包中,客户端使用 POST 方法在资源-
lab/webapp/basicauth
中填写凭据。作为回应,服务器回复 http 响应代码 200 ok ,即用户名:密码正确。
现在,在 Authorization
标头中显示它是基本认证,后跟一些随机字符串。该字符串是凭据 admin:aadd
(包括冒号)的编码(Base64)版本。
2. Http Digest身份验证(rfc 2069)
到目前为止,我们已经看到基本身份验证以明文形式在网络上发送用户名:密码。但是Digest身份验证使用哈希算法发送密码的HASH。
这里是显示客户端请求和服务器响应的数据包。
当客户端输入服务器请求的凭据时,使用算法将密码转换为一个响应
,然后将其发送到服务器。如果服务器数据库具有与客户端给出的响应相同的响应,则服务器会授予资源访问权限,否则会出现401错误。
在上面的
Authorization
中,response
字符串是使用图像中显示的Username
、Realm
、Password
、http-method
、URI
和Nonce
的值计算的:
因此,我们可以看到,摘要身份验证更加安全,因为它涉及哈希(MD5加密),因此数据包嗅探工具无法嗅探密码,尽管在基本认证中,确切的密码会显示在Wireshark上。
基本身份验证使用 64编码 来生成包含用户名和密码信息的加密字符串。
摘要访问身份验证使用哈希方法来生成加密结果。