分享
 
 
 

关于用jsp实现http认证安全登陆的学习笔记。(正在原创ing)

王朝java/jsp·作者佚名  2007-06-01
窄屏简体版  字體: |||超大  

作者 : lnboy

标题 : 关于用jsp实现http认证安全登陆的学习笔记。(正在原创ing)

关键字: jsp http认证 WWW-authenticate Basic Digest Base64 md5

分类 : JSP入门

密级 : 公开

(评分:★★★ , 回复: 2, 阅读: 1374)

前几天在CSDN看见有人问

www.cn-java.com 网站的登录对话框是怎么实现的。

(相关连接:http://expert.csdn.net/Expert/topic/1833/1833798.xml?temp=.9407923),

然后自己实验了一下,www.cn-java.com的登陆好象是用SSL来传输密码的。

根据帖子里回复的提示,

发现在jsp里写下以下代码:

<%

response.setStatus(401);

response.setHeader("Cache-Control","no-store");

response.setDateHeader("Expires",0);

response.setHeader("WWW-authenticate","Basic Realm=\"大富翁论坛用户\"");

%>

确实可以实现那样的对话框,但是对话框要出现三次才消失,

可是怎样来获取用户名字和密码呢???

终于搜索到一篇相关的文章,虽然是PHP的.

(可以用 “超越PHP authorization”作为关键字在google搜索,页面已经无法打开了,

我是通过google toolbar在网页里的右键菜单来打开快找的:

http://216.239.33.100/search?sourceid=navclient-menuext&q=cache:http%3A//www.hooday.com/manual/features.http-auth.php)

但是通过文章内容可以分析出,确实是可以取出用户名字和密码的,

OK,继续搜索(关键字 request.getHeader authorization )。

在java官方论坛找到啦:)

http://forum.java.sun.com/thread.jsp?forum=33&thread=67087&start=0&range=15&hilite=false&q=

全英文,好痛苦,不管它,找我看的懂的,

发现这样一行代码:

out.print("authentication:" + request.getHeader("Authentication"));

马上添到自己的测试页面里测试,结果取值是null :(

不怕,我继续搜索,终于发现 Http header里的不是 authentication而是authorization 才对。

改了,终于取出值了,是 Basic cXdlcjp0ZXN0,看不懂:(

再查资料,原来是Base64编码的,但我还不能够确定这就是存放的用户名字和密码啊,

怎么办???当然找Base64解码工具啦:)

google居然没有搜索到,不过总算发现了

http://www.csdn.net/cnshare/soft/14/14983.shtm

马上下载,在桌面上新建个文本文档,把cXdlcjp0ZXN0写入,保存。

结果decode仍然是乱码,仔细一看,原来自己没有选中Base64,好了,再来,

解码器生成了个eml格式我文件,Outlook打开还是乱码:(

突然灵机一动,用notepad.exe打开新建 文本文档.eml。

发现里面是固定格式的:

Content-Type: text/plain;charset="cn-gb"

Content-Transfer-Encoding: BASE64

aaaaaaa

于是把"aaaaaaa"(当时肯定不是这个啦,我已经删除内容了,所以不知道原来的乱码是什么了,随便写点东西表示一下,呵呵)

替换成 “cXdlcjp0ZXN0”,再用outlook打开一看,果然是我刚才输入的"qwer:test",

那么可以确信这就是用户名字和密码了。

剩下的就是用Base64的decode啦,可惜搜索到的几个base64源代码调试有问题。

因为要收拾东西准备回学校,暂时不再接着去摸索了,

先记点笔记在这里,下次找东西也方便点。

另外有种模仿这样的登陆效果(我是指窗口方式)的,但是是利用window.showModalDialog模态方式打开一个页面来实现的。

参考连接:http://www.hexiesoft.com/(打开这个连接可以看到效果)

要查看网页源代码则需要打开

:http://www.hexiesoft.net/hexiesoft/AnonymousAccessibleForms/login.aspx

http://www.hexiesoft.net/hexiesoft/AnonymousAccessibleForms/login.htm

今天只是刚摸索了点开头,接下来回学校隔离,等毕业答辩,等毕业,再最后正式上班。

以后有空接着记笔记,呵呵!!!

2003-6-3 18:08:00

查看评语 ?

2003-6-3 18:17:40 抓了幅图片,呵呵把源代码先记这里,免得以后找不到了。

(刚才提交不成功,原来大富翁没有在笔记屏蔽html,)

< %@ page contentType="text/html; charset=GBK" % >

< %

response.setStatus(401);

response.setHeader("Cache-Control","no-store");

response.setDateHeader("Expires",0);

response.setHeader("WWW-authenticate","Basic Realm=\"大富翁论坛用户\"");

% >

本页面演示采用 SSL加密认证的方式来传输密码。

//

参考连接:http://expert.csdn.net/Expert/topic/1833/1833798.xml?temp=.9407923

< %

String temppass= request.getHeader("authorization");

if ((temppass!=null)&&(temppass.length()>6)){

out.println("authentication:" + temppass);//经过其它方式验证,此时得到的temppass是Basic加上 Base64之后的编码

//比如我输入的用户名字qwer和密码test则得到qwer:test ,经过编码之后为cXdlcjp0ZXN0,而temppass=Basic cXdlcjp0ZXN0。

% >

2003-6-4 18:18:49 Base64解码正确了参考http://www.javaidea.net/java/basic/base64.jsp

把那两个函数放到一个Bean里的了:

package md5demo;

import sun.misc.BASE64Encoder;

import sun.misc.BASE64Decoder;

public class base64Bean {

public base64Bean() {

}

public String getBASE64(String s) {

if (s == null) return null;

return (new sun.misc.BASE64Encoder()).encode( s.getBytes() );

}

// 将 BASE64 编码的字符串 s 进行解码

public String getFromBASE64(String s) {

if (s == null) return null;

BASE64Decoder decoder = new BASE64Decoder();

try {

byte[] b = decoder.decodeBuffer(s);

return new String(b);

} catch (Exception e) {

return null;

}

}

}

Jsp里获取用户买和密码:

<%

String temppass= request.getHeader("authorization");

String temppassdecode="";

String username="";

String userpass="";

if ((temppass!=null)&&(temppass.length()>6)){

temppass= temppass.substring(6,temppass.length());

out.println("取出来的用户名字和密码base64code为:"+temppass);

temppassdecode=base64code.getFromBASE64(temppass);

out.println("<br>解码的结果是:"+temppassdecode);

}

%>

用户名字和密码之间是用冒号":"隔开的,但是如果用户名字或者密码里有冒号存在,

怎么来获取正确的用户名字和密码呢???

正待解决中......

2003-7-16 17:35:51 继续ing :)毕业了,正式上班了啦:)

呵呵,自己搞错了些概念,SSL加密传输是必须要有Verisign之类提供的服务器证书才可以。

而jsp里通过设置WWW-authenticate和 BASIC realm(基本验证,用户名字和密码采用Base64加密) 或者Digest realm(摘要验证,密码将会是用md5加密过后的数字).

(参考 http://www.cn-java.com/target/news.php?news_id=2217 中的 关于 http 验证 部分)

另,根据以下内容:

RFC 2617 HTTP Authentication June 1999

except not limited to 76 char/line>

user-pass = userid ":" password

userid = *<TEXT excluding ":">

password = *TEXT

可以确定用户名字里不能够包含 “:”的。

修改之后的代码如下(解决了即使输入正确的登陆信息,窗口也要出现三次的问题):

<%@ page contentType="text/html; charset=GBK" %>

<%@ page import="sun.misc.*"%>

<%

response.setStatus(401);

response.setHeader("WWW-authenticate","Basic realm=\"大富翁论坛用户\"");

%>

<jsp:useBean id="base64code" scope="request" class="md5demo.base64Bean"/>

<html>

<head>

<title>安全登录的实现</title>

</head>

<body bgcolor="#ffffff">

<h1>

本页面演示采用 Base64 基本认证加密认证的方式来传输密码。

</h1>

<h2>

<%

String temppass= request.getHeader("authorization");

String temppassdecode="";

String username="";

String userpass="";

if ((temppass!=null)&&(temppass.length()>6)){

out.println("<br>解码前是:"+temppass);

temppass= temppass.substring(6,temppass.length());

out.println("取出来的用户名字和密码base64code为:"+temppass);

temppassdecode=base64code.getFromBASE64(temppass);

out.println("<br>解码的结果是:"+temppassdecode);

username=temppassdecode.substring(0,temppassdecode.indexOf(":"));

userpass=temppassdecode.substring(temppassdecode.indexOf(":")+1);

out.println("<br>用户名字是:"+username);

out.println("<br>用户密码是:"+userpass);

if (username.equals("lnboy"))

{

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-store");

response.setDateHeader("Expires",0);

response.setStatus(200);

out.println("<br>登陆成功了");

}

else{

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-store");

response.setDateHeader("Expires",0);

out.println("<br>你没有登陆");

}

}

%>

</h2>

</body>

</html>

但是有个问题,验证通过的话,按 F5或者地址栏敲下回车,登陆对话框就不再会出现了,

参考http://www.cn-java.com/tologoff.php 而怎样注销我还没有想到:(

还有其它相关的东西,还在继续摸索中。

...

2003-7-17 8:43:33 又发现点,登陆成功之后,F5或者地址栏敲下回车,登陆对话框不能够再出现的原因是:

Http header里Authorization不再是空,而已经包含

类似下面的信息了:

Authorization: Basic bG5bb3k6NcUxbvIvMjId。

2003-7-20 17:28:15 发现基本验证不安全刚才看了www.cn-java.com

登陆之后,打开页面中其它连接的时候,

发出去的Http header里Authorization仍然包含有验证信息,

如果有人用工具获得了Http数据包,

经过Base64解码就可以得到用户的名字和密码,

这样将很不安全。

正在摸索摘要验证的实现,找到几篇RFC文档在看(好久没有看英文,感觉有点吃力)

已经取得一点进展,但是还有很多细节不清楚,有待继续摸索,先放幅图片再说。

呵呵,就不帖代码了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有