摘要和基本身份验证有什么区别?
摘要式身份验证通过将哈希函数应用于以下内容以加密形式传递凭据:用户名、密码、服务器提供的随机数值、HTTP 方法和请求的 URI。
而基本身份验证使用未加密的 base64 编码。
因此,基本身份验证通常只应在提供传输层安全性的情况下使用,例如 https。
有关所有血腥细节,请参阅 RFC-2617。
HTTP 基本访问认证
STEP 1 : 客户端请求信息,将用户名和密码以明文形式发送到服务器
第 2 步:服务器以所需信息或错误响应
基本身份验证使用 base64 编码(不是加密)来生成包含用户名和密码信息的加密字符串。 HTTP Basic 不需要通过 SSL 实现,但如果你不这样做,它根本不安全。所以我什至不会接受不使用它的想法。
优点:
它易于实现,因此您的客户端开发人员将有更少的工作要做并且需要更少的时间来交付,因此开发人员可能更有可能想要使用您的 API
与 Digest 不同,您可以使用任何您喜欢的加密方法(例如 bcrypt)将密码存储在服务器上,从而使密码更加安全
只需一次调用服务器即可获取信息,这使得客户端比更复杂的身份验证方法稍快一些
缺点:
SSL 运行速度比基本 HTTP 慢,因此这会导致客户端稍慢
如果您无法控制客户端,并且无法强制服务器使用 SSL,则开发人员可能不会使用 SSL,从而导致安全风险
总结——如果您可以控制客户端,或者可以确保它们使用 SSL,那么 HTTP Basic 是一个不错的选择。 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 Digest 访问身份验证是一种更复杂的身份验证形式,其工作原理如下:
STEP 1:客户端向服务器发送请求
第 2 步:服务器响应一个特殊代码(称为随机数,即只使用一次的数字),另一个代表领域的字符串(哈希)并要求客户端进行身份验证
第 3 步:客户端使用此随机数和用户名、密码和领域(哈希)的加密版本进行响应
第 4 步:如果客户端哈希与他们自己的用户名、密码和领域哈希匹配,则服务器响应请求的信息,否则返回错误
优点:
没有用户名或密码以明文形式发送到服务器,这使得非 SSL 连接比不通过 SSL 发送的 HTTP Basic 请求更安全。这意味着不需要 SSL,这使得每次调用都稍微快一些
缺点:
对于需要的每个调用,客户端必须进行 2,使得该过程比 HTTP Basic 稍慢
HTTP Digest 容易受到中间人安全攻击,这基本上意味着它可能被黑客入侵
HTTP Digest 阻止使用强密码加密,这意味着存储在服务器上的密码可能会被黑客入侵
总之,HTTP Digest 天生就容易受到至少两种攻击,而使用基于 SSL 的 HTTP Basic 对密码进行强加密的服务器不太可能共享这些漏洞。
如果您无法控制您的客户端,但是他们可以尝试在没有 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 中看起来如下:
https://i.stack.imgur.com/TH3DY.jpg
笔记:
Basic 和 Digest 方案专用于使用用户名和密码进行身份验证。
Bearer 方案专用于使用令牌进行身份验证。
让我们看看使用 Wireshark
(分析发送或接收的数据包的工具)的两种 HTTP 身份验证之间的区别。
1. Http基本认证
https://i.stack.imgur.com/moYwc.png
一旦客户端按照 Web 服务器的要求输入正确的用户名:密码,Web 服务器就会在数据库中检查凭据是否正确并授予对资源的访问权限。
以下是数据包的发送和接收方式:
https://i.stack.imgur.com/llToF.png
https://i.stack.imgur.com/Givyw.png
现在,在 Authorization
标头中,它显示它是 Basic 授权,后跟一些随机字符串。此字符串是凭据 admin:aadd
的 编码 (Base64) 版本(包括冒号)。
2. Http 摘要认证(rfc 2069)
到目前为止,我们已经看到基本身份验证通过网络以明文形式发送用户名:密码。但摘要身份验证使用哈希算法发送密码的哈希值。
以下是显示客户端发出的请求和服务器响应的数据包。
https://i.stack.imgur.com/ruoo0.png
一旦客户端键入服务器请求的凭据,密码就会使用算法转换为 response
,然后发送到服务器,如果服务器数据库与客户端给出的响应相同,则服务器授予访问权限到资源,否则会出现 401 错误。
https://i.stack.imgur.com/E04cK.png
https://i.stack.imgur.com/5k3eJ.png
因此,我们可以看到摘要式身份验证更安全,因为它涉及哈希(MD5 加密),因此数据包嗅探器工具无法嗅探密码,尽管在基本身份验证中,Wireshark 上显示了确切的密码。