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


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

    上一篇 / 下一篇  2011-10-19 15:56:15 / 个人分类:java

    一.  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.01.1规范的客户端(如IEFIREFOX)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。

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

    Get /index.html HTTP/1.0
    Host:www.google.com
    Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx

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

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

     

    三.        BASIC认证的缺点

    HTTP基本认证的目标是提供简单的用户验证功能,其认证过程简单明了,适合于对安全性要求不高的系统或设备中,如大家所用路由器的配置页面的认证,几乎都采取了这种方式。其缺点是没有灵活可靠的认证策略,如无法提供域(domainrealm)认证功能,另外,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=newString(newBASE64Decoder().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);

         }

    //----------------------------------------------------------------

    <?php
        
    if (!isset($_SERVER['PHP_AUTH_USER'])) {
            
    header("WWW-Authenticate: Basic realm=\"Private Area\"");
            
    header("HTTP/1.0 401 Unauthorized");
            print
     "Sorry - you need valid credentials to be granted access!\n";
            exit;
        } else {
            if ((
    $_SERVER['PHP_AUTH_USER'] == 'paul') && ($_SERVER['PHP_AUTH_PW'] == 'hudson')) {
                print
     "Welcome to the private area!";
            } else {
                
    header("WWW-Authenticate: Basic realm=\"Private Area\"");
                
    header("HTTP/1.0 401 Unauthorized");
                print
     "Sorry - you need valid credentials to be granted access!\n";
                exit;
            }
        }
    ?>

  • 相关阅读:
    addChildViewController ipad 中Controller的嵌套和叠加
    Oracle中sign函数和decode函数的使用
    MapReduce调度与执行原理之任务调度
    [置顶] SOLR 4.4 部署
    [笔试] 怪物安全问题
    优先队列的使用——Expedition
    棋盘分割——维数较大的动态规划
    由DAG到背包问题——记忆化搜索和递推两种解法
    硬币问题——记忆化搜索与递推的转换
    DAG上的动态规划---嵌套矩形(模板题)
  • 原文地址:https://www.cnblogs.com/fx2008/p/2819601.html
Copyright © 2020-2023  润新知