欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅谈HTTP使用BASIC认证的原理及实现方法

程序员文章站 2024-03-12 13:26:44
一.basic认证概述 在http协议进行通信的过程中,http协议定义了基本认证过程以允许http服务器对web浏览器进行用户身份证的方法,当一个客户端向http服务...

一.basic认证概述

在http协议进行通信的过程中,http协议定义了基本认证过程以允许http服务器对web浏览器进行用户身份证的方法,当一个客户端向http服务 器进行数据请求时,如果客户端未被认证,则http服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。客户端在接收到http服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以base64加密,加密后的密文将附加于请求信息中, 如当用户名为anjuta,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用base64加密为密文,并于每次请求数据 时,将密文附加于请求头(request header)中。http服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(base64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用 户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。

二.basic认证的过程

1.客户端向服务器请求数据,请求的内容可能是一个网页或者是一个其它的mime类型,此时,假设客户端尚未被验证,则客户端提供如下请求至服务器:

get /index.html http/1.0
host:www.google.com

2.服务器向客户端发送验证请求代码401,服务器返回的数据大抵如下:

http/1.0 401 unauthorised
server: sokevo/1.0
www-authenticate: basic realm="google.com"
content-type: text/html
content-length: xxx

3.当符合http1.0或1.1规范的客户端(如ie,firefox)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。

4.用户输入用户名和密码后,将用户名及密码以base64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容:

get /index.html http/1.0
host:www.google.com
authorization: basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx

注:xxxx....表示加密后的用户名及密码。

5.服务器收到上述请求信息后,将authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端:

三.basic认证的缺点

http基本认证的目标是提供简单的用户验证功能,其认证过程简单明了,适合于对安全性要求不高的系统或设备中,如大家所用路由器的配置页面的认证,几乎 都采取了这种方式。其缺点是没有灵活可靠的认证策略,如无法提供域(domain或realm)认证功能,另外,base64的加密强度非常低,可以说仅 能防止sohu的搜索把它搜到了。当然,http基本认证系统也可以与ssl或者kerberos结合,实现安全性能较高(相对)的认证系统

四.basic认证的java实现代码

httpsession session=request.getsession();
     string user=(string)session.getattribute("user");
     string pass;
     if(user==null){
       try{
        response.setcharacterencoding("gbk");
        printwriter ut=response.getwriter();
        string authorization=request.getheader("authorization");
        if(authorization==null||authorization.equals("")){
          response.setstatus(401);
          response.setheader("www-authenticate","basic realm=\"请输入管理员密码\"");
          out.print("对不起你没有权限!!");
          return;
        }
        string userandpass=new string(new base64decoder().decodebuffer(authorization.split(" ")[1]));
        if(userandpass.split(":").length<2){
          response.setstatus(401);
          response.setheader("www-authenticate","basic realm=\"请输入管理员密码\"");
          out.print("对不起你没有权限!!");
          return;
        }
        user=userandpass.split(":")[0];
        pass=userandpass.split(":")[1];
        if(user.equals("111")&&pass.equals("111")){
          session.setattribute("user",user);
          requestdispatcher dispatcher=request.getrequestdispatcher("index.jsp");
          dispatcher.forward(request,response);
        }else{
          response.setstatus(401);
          response.setheader("www-authenticate","basic realm=\"请输入管理员密码\"");
          out.print("对不起你没有权限!!");
          return;
        }
       }catch(exception ex){
        ex.printstacktrace();
       }
     }else{
       requestdispatcher dispatcher=request.getrequestdispatcher("index.jsp");
       dispatcher.forward(request,response);
}

以上就是小编为大家带来的浅谈http使用basic认证的原理及实现方法全部内容了,希望大家多多支持~