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 路由器管理页面使用基本认证
我们普通家庭里都会使用路由器,路由器的管理页面使用的就是基本认证,我们通过这个实例来理解基本认证的过程。
- 找出路由器的 IP 地址,在 CMD 中输入 ipconfig 命令能知道路由器的 IP 地址,比如路由器的 IP 地址是 10.0.0.1
- 启动 Fiddler,打开浏览器,输入 http://10.0.0.1 ,可以打开一个网页,网页会弹出对话框,要求用户输入用户名和密码。
-
路由器用户名/密码是 admin/password。在对话框中输入用户名 admin 和密码 password2。因为密码错误,所以认证不会通过,服务器会返回 401 状态码。
在 HTTP 请求中可以看到有个 Authorization:Basic YWRtaW46cGFzc3dvcmQy。这是因为浏览器把“用户名+冒号+密码”用 Base64 编码了。例如 admin:password2 被编码后,就变成了 YWRtaW46cGFzc3dvcmQy。
使用 Fiddler 中的 Auth 选项卡,可以方便地看到用户名和密码,以及编码后的字符串。
- 输入正确的用户名和密码(admin/password),认证通过,服务器返回 200 状态码给浏览器客户端
这时就可以正常打开路由器的管理界面:
13.1.2 HTTP 基本认证的优点
HTTP 基本认证简单明了,Restful API 就经常使用基本认证。
13.1.3 HTTP 基本认证的缺点
把 “用户名+冒号+密码”用 Base64 编码后的字符串虽然用肉眼看不出来,但用程序很容易解码,所以不能用 HTTP 在网络上传输。
【注意】一定要用 HTTPS 传输,因为 HTTPS 是加密的,稍微安全一点。
- HTTP 协议是无状态的,同一个客户端对服务器的每个请求都要求认证。
- 基本认证会通过网络发送用户名和密码,这些用户名和密码以 Base64 编码。Base64 编码是一种可逆编码,非常容易破解,所以基本认证相当于以明文的方式传输用户名和密码,非常容易被第三方拦截
- 使用基本认证登录后,除非关闭浏览器或者清除历史记录,否则将无法登出。
- 无法防止重放攻击。即使基本认证的密码是经过加密传输的,第三方仍然可以捕获被修改过的用户名和密码,并将修改过的用户名和密码反复多 次地重放给原始服务器,以获得对服务器的访问权 , 基本认证没有什么措施可以防止这些重放攻击。
13.1.4 使用 TextWizard 工具
单击 Fiddler 工具栏中 的 TextWizard ,可以调出 一个小工具 TextWizard 来进行 Base64 编码和解码。
13.1.5 客户端的使用
客户端跟“ 使用基本认证的网站”交互非常简单,把用户名、密码加在 Authorization header 中就可以了。
1 | string url = "https://testsite"; |
Linux 下的 curl 如下:
1 | curl -u username:password https://testsite/ |
13.2 摘要认证
摘要认证是针对基本认证存在的诸多问题而进行改良的方案。摘要认证是另外一种 HTTP 认证协议,它试图修复基本认证的严重缺陷,进行如下改进。
- 通过传递用户名、密码等计算出来的摘要来解决以明文方式在网络上发送密码的问题
- 通过服务器产生随机数 nonce 的方式防止恶意用户捕获并重放认证的握手过程
- 通过客户端产生随机数 enonce 的方式支持客户 端对服务器的认证
- 通过对内容也加入摘要计算的方式,可以有选择地防止对报文内容的篡改
参考
《HTTP 抓包实战》