反骨仔

一个业余的 .NET Core 攻城狮

0%

13 HTTP 基本认证

HTTP 协议是无状态的,浏览器和 Web 服务器之间可以通过 Cookie 来识别身份 。一些桌面应用程序(比如新浪桌面客户端、OneDrive 客户端和 Dropbox 客户端)跟 Web 服务器之间是如何识别身份呢?

HTTP 协议中还有两种认证方式,分别是基本认证摘要认证 。认证就是客户端要给服务器出示一些自己的身份证明,来证明自己是谁,一旦服务器知道了客户端 的身份,就可以判定客户端可以进行访问了。通常是通过提供用户名和密码来进行认证的。

13.1 什么是 HTTP 基本认证

一些网站和 Web 服务使用的是 HTTP 基本认证。有些桌面应用程序也通过 HTTP 协议跟 Web 服务器交互,桌面应用程序一般不会使用 Cookie,而是把“用户名 + 冒号 + 密码”用 Base64 编码放在 HTTP 请求中的 Header Authorization 中发送给服务端,这种方式叫 HTTP 基本认证(Basic Authentication) 。

在基本认证中, Web 服务器可以拒绝一个事物,要求客户端提供有效的用户名和密码。服务器会返回 401 状态码来初始化认证质询,并用 WWW-Authenticate 响应首部指定要访问的安全域 。浏览器收到质询肘,会打开一个对话框,请求用户输入用户名和密码,然后将用户名和密码用 Base64 编码,再用 Authorization 请求首部发送给服务器。

13.1.1 路由器管理页面使用基本认证

我们普通家庭里都会使用路由器,路由器的管理页面使用的就是基本认证,我们通过这个实例来理解基本认证的过程。

  1. 找出路由器的 IP 地址,在 CMD 中输入 ipconfig 命令能知道路由器的 IP 地址,比如路由器的 IP 地址是 10.0.0.1

image-20210110152823622

  1. 启动 Fiddler,打开浏览器,输入 http://10.0.0.1 ,可以打开一个网页,网页会弹出对话框,要求用户输入用户名和密码。

image-20210110152929555

  1. 路由器用户名/密码是 admin/password。在对话框中输入用户名 admin 和密码 password2。因为密码错误,所以认证不会通过,服务器会返回 401 状态码。

    在 HTTP 请求中可以看到有个 Authorization:Basic YWRtaW46cGFzc3dvcmQy。这是因为浏览器把“用户名+冒号+密码”用 Base64 编码了。例如 admin:password2 被编码后,就变成了 YWRtaW46cGFzc3dvcmQy。

image-20210110153407821

使用 Fiddler 中的 Auth 选项卡,可以方便地看到用户名和密码,以及编码后的字符串。

image-20210110153438278

  1. 输入正确的用户名和密码(admin/password),认证通过,服务器返回 200 状态码给浏览器客户端

image-20210110153526699

这时就可以正常打开路由器的管理界面:

image-20210110153549259

13.1.2 HTTP 基本认证的优点

HTTP 基本认证简单明了,Restful API 就经常使用基本认证。

13.1.3 HTTP 基本认证的缺点

把 “用户名+冒号+密码”用 Base64 编码后的字符串虽然用肉眼看不出来,但用程序很容易解码,所以不能用 HTTP 在网络上传输。

【注意】一定要用 HTTPS 传输,因为 HTTPS 是加密的,稍微安全一点。

  1. HTTP 协议是无状态的,同一个客户端对服务器的每个请求都要求认证。
  2. 基本认证会通过网络发送用户名和密码,这些用户名和密码以 Base64 编码。Base64 编码是一种可逆编码,非常容易破解,所以基本认证相当于以明文的方式传输用户名和密码,非常容易被第三方拦截
  3. 使用基本认证登录后,除非关闭浏览器或者清除历史记录,否则将无法登出。
  4. 无法防止重放攻击。即使基本认证的密码是经过加密传输的,第三方仍然可以捕获被修改过的用户名和密码,并将修改过的用户名和密码反复多 次地重放给原始服务器,以获得对服务器的访问权 , 基本认证没有什么措施可以防止这些重放攻击。

13.1.4 使用 TextWizard 工具

单击 Fiddler 工具栏中 的 TextWizard ,可以调出 一个小工具 TextWizard 来进行 Base64 编码和解码。

image-20210116204937697

image-20210110154249736

13.1.5 客户端的使用

客户端跟“ 使用基本认证的网站”交互非常简单,把用户名、密码加在 Authorization header 中就可以了。

1
2
3
4
string url = "https://testsite";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
NetworkCredential nc =new NetworkCredential("username", "password");
req.Credentials = nc ;

Linux 下的 curl 如下:

1
curl -u username:password https://testsite/

13.2 摘要认证

摘要认证是针对基本认证存在的诸多问题而进行改良的方案。摘要认证是另外一种 HTTP 认证协议,它试图修复基本认证的严重缺陷,进行如下改进。

  1. 通过传递用户名、密码等计算出来的摘要来解决以明文方式在网络上发送密码的问题
  2. 通过服务器产生随机数 nonce 的方式防止恶意用户捕获并重放认证的握手过程
  3. 通过客户端产生随机数 enonce 的方式支持客户 端对服务器的认证
  4. 通过对内容也加入摘要计算的方式,可以有选择地防止对报文内容的篡改

参考

《HTTP 抓包实战》