一、HTTP认证
认证就是给出一些身份证明,说明你是声称的那个人。
HTTP提供了一个原生的质询/响应的框架:
(1)客户端请求服务器的某一受保护的资源
(2)服务器拒绝提供资源,并向客户端发起质询,询问用户名和密码
(3)客户端向服务器传送用户名、密码
(4)服务器检验认证成功,将资源提供给客户端
二、基本认证(Basic认证)
基本认证步骤:
(1)客户端请求服务器某一受保护的资源
(2)服务器拒绝提供资源,并对客户端进行质询,返回一条状态为401 (Unauthorized Required)的响应,并在header中的WWW-Authenticate中说明认证方式
(3)客户端重新发送请求,并在header中的Authorization加上用户名、密码等认证参数。基本认证将用户名和密码打包在一起,并使用base-64编码方式对其进行编码。
(4)服务器检验成功后,返回一个正常状态码(如200)的响应,响应包含了请求的URI
基本认证安全缺陷:
(1)通过网络发送用户名和密码,虽然进行base-64编码可以隐藏用户名和密码,但base-64是可逆的,很容易进行反向编码。
(2)很多用户会对不同的服务使用同样的用户名和密码,基本认证直接发送用户名和密码,如被截货,会对其他的服务(比如在线支付)造成很大的威胁。
(3)没有提供对报文内容的防篡改保护,加入报文在传输过程中被代理截获,并被修改了报文的内容,被导致严重后果。
基本认证应用范围:
内些内部网站,家用路由器的管理页面,可能使用HTTP基本认证
下面是使用Fiddler对家用路由器登陆过程的抓包
三、摘要认证(Digest认证)
摘要认证利用摘要算法(如MD5)对用户名、密码、报文内容等做不可逆的编码,来防止重要信息被获取、篡改。
摘要认证步骤:
(1)客户端请求服务器某一受保护的资源
(2)服务器拒绝提供资源,并对客户端进行质询,生成一个随机数nonce,返回一条状态为401 (Unauthorized Required)的响应,并在header中的WWW-Authenticate中放置随机数nonce,并说明认证方式
(3)客户端选择一个算法(auth或者auth-int),计算出密码和其他数据的摘要,将摘要(response)和算法(qop)放在Authorization头部中。如果客户端还要对服务器进行认证,则生成客户端随机数(cnonce)、随机数生成次数(nc)也放在Authorization中发送服务器。
(4)服务器收到算法及支撑数据(请求方法、请求uri、服务器随机数等),计算出摘要,与客户端摘要进行比较,验证是否匹配。另外如果客户端发送cnonce,服务器会再生成一个随机数(nextnonce)出来,然后根据nextnonce、cnonce、实体主体等等生成应答摘要(rspauth),加到Authorization-Info头部中,返回客户端。
(5)客户端收到返回后,再算出摘要,与服务器返回的rspauth比较,验证是否匹配。后如果还要发送请求,重复3、4、5步骤。
摘要认证安全缺陷:
无法防止中间人攻击。一个中间人可以告知客户端使用基本认证模式,而摘要访问认证没有提供任何机制帮助客户端验证服务器的身份。
密码要进行可逆可还原的保存。很多用户会对不同的服务使用同样的用户名和密码,一旦服务器、客户端的密码被窃取还原,会对其他的服务(比如在线支付)造成很大的威胁。
摘要认证应用范围:
目前部分建设初期网站、内部网站可能使用摘要认证。
四、基于HTTPS+表单的认证
(一)HTTPS过程
(1)客户端到服务器
Client Hello:
客户端向服务器发送Client Hello报文开始SSL通信。报文中包含客户端SSL版本、组件等相关信息。
(2)服务器到客户端
Server Hello:
服务器可进行SSL通信时,以Server Hello 报文作为响应。报文中包含服务器SSL版本、组件等相关信息
Certificate Server Key Exchange:
服务器发送Certificate Server Key Exchange报文,报文中包含公开**证书
Server Hello Done:
服务器发送 Server Hello Done 报文, 第一阶段SSL握手协商完成
(3)客户端到服务器
Client Key Exchange:
客户端发送Client Key Exchange 报文。 报文中包含已用服务器的公开**加密的Pre-master secret随机密码串
Change Cipher Spec:
客户端发送 Change Cipher Spec 报文,提示服务器后续通信会采用 Pre-master secret **加密。
Encryted Handshake Message:
客户端发送 Encryted Handshake Message报文。 该报文包含连接至今全部报文的整体校验值。 这次握手协商是否能够成功, 要以服务器是否能够正确解密该报文作为判定标准
(4)服务器到客户端
服务器同样发送 Change Cipher Spec 报文
服务器同样发送Encryted Handshake Message报文
(5)SSL连接建立完成
开始应用层的HTTP协议的通信
(二)基于HTTPS+表单的认证过程
(1)客户端将用户名、密码放入报文,通过 POST 方法发送请求到服务器。使用 HTTPS进行HTML数据的发送
(2)服务器验证收到的客户登录信息,认证通过后发送用户的 Session ID,并将认证状态与Session ID 绑定后记录下来。
(3)服务器向发送响应,并会在header中使用 Set-Cookie 写入 Session ID。服务器端对Session ID进行有效期的管理,保证其安全性。同时,为减轻跨站脚本攻击(XSS) 造成的损失,会在 Cookie内加上 httponly 属性。
(4)客户端收到响应的Session ID ,作为Cookie 保存在本地。下次向服务器发送请求时,自动发送该Cookie, 服务器端即可通过验证识别用户认证状态。
目前大多数Web网站均使用基于HTTPS+表单的认证过程,上图为douban豆瓣网的登录过程抓包