博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

http 基本认证 摘要认证

Posted on 2013-12-02 16:25  bw_0927  阅读(2049)  评论(0)    收藏  举报

http://shellblog.sinaapp.com/?p=357

认证就是客户端要给服务器出示一些自己的身份证明,来证明自己是谁!一旦服务器知道了客户端的身份,就可以判定客户端可以访问的事务和资源了。 在HTTP中,认证通常是通过提供用户名和密码来进行认证的。我们来介绍一下常用的两种认证方式:基本认证与摘要认证!

一、基本认证

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

1.基本认证实例

1)用户请求服务器上某资源:/family/jeff.jpg。

2)服务器回送一条401 Authrization Required,对此资源进行密码质询。同时通过WWW-Authenticate首部说明如何以及在哪里认证。

3)浏览器收到401质询,弹出认证对话框。用户输入用户名和密码后,浏览器会用一个冒号将其连接在一起,并经过Base64编码,然后将其放入Authorization首部发送给服务器。

4)服务器对用户名和密码进行解码,验证他们的正确性,然后用一条HTTP 200 OK报文返回所请求的资源。

2.基本认证缺点

1)基本认证会通过网络发送用户名和密码,这些用户名和密码以Base64编码,Base64编码是一种可逆编码,非常容易破解,所以基本认证相当于以明文的方式传输用户名和密码,非常容易被第三方拦截

2)使用基本认证登录后,除非关闭浏览器或者清除历史记录,不然无法登出!

3)基本认证没有考虑到重放攻击,即使base64编码是不可逆的,攻击者也可以通过重放攻击来获得服务器的信任。

二、摘要认证

为了弥补基本认证的不足,摘要认证做了以下改进:

 1)以密文(不可逆)形式发送密码。

 2)防止重放攻击

1.如何加密?

摘要认证遵循的箴言是“绝不通过网络发送密码”,客户端不会发送密码,而是会发送一个指纹或密码的“摘要”,这是密码的不可逆扰码。客户端和服务器都知道密码,因此服务器可以验证所提供的摘要是否与密码相配。

【认证方式:客户端发送生成摘要的所有必要因素,以及生成的摘要;服务器通过摘要因素以及数据库中保存的用户帐号密码,用相同的摘要算法计算摘要,看是否和客户端发来的摘要一样进行认证】

摘要是对信息主题的浓缩。摘要是一种单向函数,主要用于将无限的输入值转换为有限的浓缩输出。常见的摘要函数MD5,会将任意长度的字节序列转换为一个128位的摘要。

2.如何防止重放攻击?

使用单向散列函数加密密码,可以保证密码不以明文形式传送,但是仅仅隐藏密码并不能避免危险,因为即便是不知道密码,攻击者可以通过截获摘要,一遍遍的重放给服务器。在重放攻击的角度,加密和不加密没有区别。

摘要认证中防止重放攻击的前提条件是客户端和服务器都知道密码的明文形式。服务器先发送给客户端一个随机数,客户端使用散列函数加密随机数和密码,然后发送给服务器端。这样即使第三方截获报文,利用重放攻击进行认证也无济于事,因为每次事务的随机数不一样

=========================

http://blog.csdn.net/hotnet522/article/details/5824696

http://blog.csdn.net/hotnet522/article/details/5824716

HTTP请求报头: Authorization
HTTP响应报头: WWW-Authenticate
 
HTTP认证 
基于
 
质询 
/回应( 
challenge/response)的认证模式。
 
◆ 基本认证 basic authentication   ← HTTP1.0提出的认证方法
    客户端对于每一个realm,通过提供用户名和密码来进行认证的方式。
    ※ 包含密码的明文传递
 
    基本认证步骤:
     1. 客户端访问一个受http基本认证保护的资源。
     2. 服务器返回401状态,要求客户端提供用户名和密码进行认证。
           401 Unauthorized
           WWW-Authenticate: Basic realm="WallyWorld"
     3. 客户端将输入的用户名密码用Base64进行编码后,采用非加密的明文方式传送给服务器。
           Authorization: Basic xxxxxxxxxx.
     4. 如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。
 
    特记事项
     1. Http是无状态的,同一个客户端对同一个realm内资源的每一个访问会被要求进行认证。
     2. 客户端通常会缓存用户名和密码,并和authentication realm一起保存,所以,一般不需要你重新输入用户名和密码。
     3. 以非加密的明文方式传输,虽然转换成了不易被人直接识别的字符串,但是无法防止用户名密码被恶意盗用。
 
◆ 摘要认证 digest authentication   ← HTTP1.1提出的基本认证的替代方法
    服务器端以nonce进行质询,客户端以用户名,密码,nonce,HTTP方法,请求的URI等信息为基础产生的response信息进行认证的方式。
    ※ 不包含密码的明文传递
    
    摘要认证步骤:
     1. 客户端访问一个受http摘要认证保护的资源。
     2. 服务器返回401状态以及nonce等信息,要求客户端进行认证。
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest
realm="testrealm@host.com",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
     3. 客户端将以用户名,密码,nonce值,HTTP方法, 和被请求的URI为校验值基础而加密(默认为MD5算法)的摘要信息返回给服务器。
           认证必须的五个情报:
     ・ realm : 响应中包含信息
     ・ nonce : 响应中包含信息
     ・ username : 用户名
     ・ digest-uri : 请求的URI
     ・ response : 以上面四个信息加上密码信息,使用MD5算法得出的字符串。
 
Authorization: Digest 
username="Mufasa",  ← 客户端已知信息
realm="testrealm@host.com",   ← 服务器端质询响应信息
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",  ← 服务器端质询响应信息
uri="/dir/index.html", ← 客户端已知信息
qop=auth,   ← 服务器端质询响应信息
nc=00000001, ← 客户端计算出的信息
cnonce="0a4f113b", ← 客户端计算出的客户端nonce
response="6629fae49393a05397450978507c4ef1", ← 最终的摘要信息 ha3
opaque="5ccc069c403ebaf9f0171e9517f40e41"  ← 服务器端质询响应信息
     4. 如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。
 
    特记事项:
     1. 避免将密码作为明文在网络上传递,相对提高了HTTP认证的安全性。
     2. 当用户为某个realm首次设置密码时,服务器保存的是以用户名,realm,密码为基础计算出的哈希值(ha1),而非密码本身
     3. 如果qop=auth-int,在计算ha2时,除了包括HTTP方法,URI路径外,还包括请求实体主体,从而防止PUT和POST请求表示被人篡改。
     4. 但是因为nonce本身可以被用来进行摘要认证,所以也无法确保认证后传递过来的数据的安全性。
 
   ※ nonce:随机字符串,每次返回401响应的时候都会返回一个不同的nonce。 
   ※ nounce:随机字符串,每个请求都得到一个不同的nounce。 
      ※ MD5(Message Digest algorithm 5,信息摘要算法)
         ① 用户名:realm:密码 ⇒ ha1
         ② HTTP方法:URI ⇒ ha2
         ③ ha1:nonce:nc:cnonce:qop:ha2 ⇒ ha3
 
◆ WSSE(WS-Security)认证  ← 扩展HTTP认证
   WSSE UsernameToken
    服务器端以nonce进行质询,客户端以用户名,密码,nonce,HTTP方法,请求的URI等信息为基础产生的response信息进行认证的方式。
    ※ 不包含密码的明文传递
    
    WSSE认证步骤:
     1. 客户端访问一个受WSSE认证保护的资源。
     2. 服务器返回401状态,要求客户端进行认证。
HTTP/1.1 401 Unauthorized
WWW-Authenticate: WSSE
realm="testrealm@host.com",
profile="UsernameToken" ← 服务器期望你用UsernameToken规则生成回应
※ UsernameToken规则:客户端生成一个nonce,然后根据该nonce,密码和当前日时来算出哈希值。
     3. 客户端将生成一个nonce值,并以该nonce值,密码,当前日时为基础,算出哈希值返回给服务器。
Authorization: WSSE profile="UsernameToken"
X-WSSE:UsernameToken
username="Mufasa",
PasswordDigest="Z2Y......",
Nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
Created="2010-01-01T09:00:00Z"
     4. 如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。
 
    特记事项:
     1. 避免将密码作为明文在网络上传递。
     2. 不需要在服务器端作设置。
     3. 服务器端必须保存密码本身【用户必须得注册啊】,否则无法进行身份验证。