HTTP的质询/响应认证框架
认证协议与首部
HTTP 通过一组可定制的控制首部,为不同的认证协议提供了一个可扩展框架。
步骤 | 首部 | 描述 | 方法/状态 |
---|---|---|---|
请求 | 第一条没有认证信息 | GET | |
质询 | WWW-Authenticate | 服务器用 401 状态拒绝了请求,说明需要用户提供用户名和密码。 | 401 Unauthorized |
授权 | Authorization | 客户端重新发出请求,但这一次会附加一个Authorization首部,用来说明认证算法、用户名和密码 | GET |
成功 | Authentication-Info | 如果授权证书是正确的,服务器就会将文档返回。 | 200(基本认证没有此首部) |
基本认证
我的这篇博客里面,有对HTTP基本认证的一个示例。
摘要认证
基本认证便捷灵活,但极不安全。用户名和密码都是以明文形式(只用Base64编码进行了扰码,没有任何防止用户攻击的手段)传送的。
摘要认证的改进
摘要认证是另一种 HTTP 认证协议,它试图修复基本认证协议的严重缺陷。具体来说,摘要认证进行了如下改进。
- 永远不会以明文方式在网络上发送密码。
- 可以防止恶意用户捕获并重放认证的握手过程。
- 可以有选择地防止对报文内容的篡改。
- 防范其他几种常见的攻击方式。
网上有很多文章详细介绍了摘要认证,这里我就简单的说明一下摘要认证是什么原理,怎么改进了基本认证的缺陷。
首先基本认证的一个重大缺陷就是在请求中使用了Base64加密来传输了用户名和密码,Base64是对称加密,也就意味着如果有人截获了请求,那么就相当于用户名和密码全部暴露了,这是非常危险的事情。
所以摘要认证的基本原则就是绝不通过网络发送明文密码,而是发送一个密码的摘要信息来取代密码,并且这个摘要信息是不可逆的,也就是我们需要用非对称加密算法来加密。例如md5加密。比如客户端需要加密的信息是hello world
,经过md5加密后请求发送的是5eb63bbbe01eeed093cb22bb8f5acdc3
这一串密文,任何人截获到这段密文是无法反推回hello world
的,然后服务端收到这个密文后。他先去数据库中找到你存储的密文hello world
(当然是根据你传过来的未加密的用户名来找的,我们省略了没说),然后服务端也对hello world
进行md5加密,对比加密后的字符串和客户端发过来的,当然一样啦,那就验证通过了。
当然,这里会有一个严重的问题,黑客截获了摘要信息和密码一样好用,他只要伪造请求,然后把摘要信息再发给服务端就照样可以为所欲为了。那么怎么办呢?加随机数就可以解决。服务端第一次发一个随机串randomStr
给客户端,当然,服务端自己也记下来我发了