HTTP使用BASIC认证的原理及实现方法(还有NTLM方法,比较复杂)

摘要:
HTTP协议定义了允许HTTP服务器为WEB浏览器执行用户身份证的基本认证过程。HTTP服务器将通过基本认证过程验证客户端的用户名和密码,并根据协议获得客户端的附加用户信息(用户名和密码由BASE64加密)。返回错误代码或请求客户端再次提供用户名和密码;ww.google.com 2。服务器向客户端发送验证请求代码401:用户需要输入用户名和密码。

一.   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=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://blog.itpub.net/23071790/viewspace-709367/

还有NTLM方法,比较复杂:

http://www.cnblogs.com/chnking/archive/2007/11/20/965553.html

免责声明:文章转载自《HTTP使用BASIC认证的原理及实现方法(还有NTLM方法,比较复杂)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# SerialPort运行方式[转载]C#版可调节的文字阴影特效下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HANA学习笔记1-搭建HANA学习环境

一 硬件环境     两台电脑,一台为服务器装跑HANA虚拟机,一台为客户端运行HANA_STUDIO     服务器:内存至少需要16G     windows server 2003 64位     客户端:windows 7 64位   二软件环境     服务器:VMware 9.0    HANA虚拟机镜像     客户端:jdk   sapca...

python 发邮件脚本

相关模块介绍     发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍:    1、smtplib模块       smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])    SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接可以向smtp...

wampserver修改mysql数据库密码的简单方式

刚装好的wampserver的数据库是没有密码的,所以可以直接登录,要设置密码,一种简单的方式如下: 打开phpMyadmin 初始状态没有密码,可以直接登录 登录之后,点击账户 点击修改权限,设置你的密码即可。 之后打开目录wamp>apps>phpmyadmin文件夹下的【config.inc.PHP】文件, 修改【$cfg['Se...

使用HttpURLConnection通过post请求服务器时,URLEncode编码的必要性

通过Post提交表单数据时,数据类型为x-www-urlencoded,提交到服务器的数据服务器默认是通过URLEncoder.encode()编码过得,所以服务器处理时会用URLDecoder.decode(s)进行解码,此时传输的数据就不能包括一些特殊字符。如+、%2b原因:通过URLEncoder.encode()空格会被编码成+号,+号会被编码成%...

超实用的华为云服务器选购技巧经验!

云服务器怎么选?   许多人在购买云服务器时,看到多种型号、各种规格的云服务器,难免犯懵,一时间不知道该怎么选择,选择标准千千万,怎么选择到最好最合适自己的那一款呢?   能帮你选择到最合适的,就是最好的标准。   1、选型号   灵魂第一问:我买云服务器是要做什么?   比如:   我要建一个网站   我要用来做图片渲染   我要用来做开发测试环境   ...

阿里云Canal 数据同步

阿里云Canal 数据同步 1.同步工作原理:把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Mater发送 dump协议,MySQL mater收到canal发送过来的dump请求,开始推送binary log给canal,然后canal解析binary log,再发送到存储目的地,比如MySQL,Kafka,Ela...