用户登录具体实现与安全防范
用户登录具体实现与安全防范
原文地址:【http://www.wegoteam.cn/wego/newdetail.php?id=79】
1.现有技术的缺陷
在用户登录模块,本文将以中国知网(www.cnki.net)为例进行对比分析。登录功能是大多数系统都有的模块,完成功能并不难,但是如何做到安全,这是一个比较难得问题。下图5-1是于2014年5月28号在登录知网时通过浏览器截取的http请求内容。在该图中可以看到,Form Data部分用户名:555555及密码:555555都是未经加密传输的明文字符。而明文传输将引起非常多的安全隐患,任何人都可以读取并捕获明文信息。从而导致用户账号被泄露。
图5-1 中国知网登录http协议截图【WEGOTEAM】
2.本系统的改进
在现有条件下,对用户密码进行保护主要有两种方式,一种是摘要认证,一种是使用安全的https。由于后者需要向第三方购买认证,成本较大,因此本系统将采用摘要认证。在本系统登录中,系统采用了Base64、MD5算法、随机码、时间戳等技术,对用户的登录密码与随机码、时间戳混合并进行两次MD5运算,从而可以有效保护用户密码,并能防止攻击者恶意篡改及对服务器进行重放攻击。
3.登录的具体实现
(1).在浏览器端对用户的输入的密码进行两次MD5运算,对用户名进行Base64运算,对随机码进行一次MD5运算。具体代码如下:
var temppassword=$.md5(parseInt((new Date()).valueOf()/10000)
+$.md5($("#password").val())+$("#randcode").val());
$("#Md5randomImageStr").val($.md5($("#randcode").val()));
$("#Md5password").val(temppassword);
$("#Base64userName")
.val($.base64.encode($("#username").val()));
在该代码中,系统首先获得了当前时间戳,并除以10000并取整,从而可以获得当前时间,单位为10秒。接下来系统对用户输入的密码进行一次MD5运算,最后系统将取整后的时间戳与一次MD5运算后的密码及用户输入的随机码混合并进行二次MD5运算,最终获得了登录密码摘要。在对密码进行处理后,系统还分别对随机码进行了一次MD5运算,对用户名进行了一次Base64运算。最终登录时的http协议如图5-2所示,从该图中可以看到,Form Data中的username,password,randcode都是加密过后的数据。
图5-2 本系统登录http协议截图【WEGOTEAM】
(2).在对浏览器端数据进行加密后,系统要完成正确的用户登录,服务器端必须采用与客户端响应的运算规则。首先服务器必须判断验证码是否正确,代码如下:
String str2 = (String) (session.get("random"));
if(str2==null||!this.getRandcode()
.equals(Tools.encrytMD5(str2.toLowerCase()))){
message= "验证码有误";
return "loginerror";
}
在本段代码中,系统首先从服务器端获取生成随机码图片时保存的验证码,在获得验证码后,将验证码进行一次MD5运算并与用户输入的进行判断。该验证码技术的使用能有效防止非法用户使用机器暴力破解系统。
(3).在对验证码进行判断后,系统需要根据用户名查询用户的详细信息,具体代码如下:
user.setUsername(new String(Base64.decode(user.getUsername())));
String strHQL = "from User u where u.username = ? and u.state>=1";
users = this.userService.findByHQL(strHQL, user.getUsername());
if (users.size() == 0) {
message = "用户名不存在!";
return "loginerror";
}
(4).获得用户详细信息后,系统需要在服务器端采用相同计算用户登录摘要,并将计算得到的摘要与用户的输入进行比对,具体代码如下:
long curTime=System.currentTimeMillis()/10000;
String tempPassword=curTime+users.get(0).getPassword()
+str2.toLowerCase();
curTime=curTime-1;
String tempPassword2=curTime+users.get(0).getPassword()
+str2.toLowerCase();
if(!user.getPassword().equals(Tools.encrytMD5(tempPassword))
&&!user.getPassword().equals(Tools.encrytMD5(tempPassword2))){
message= "登录超时或密码有误";
return "loginerror";
}
在本段代码中,系统首先获得当前时间戳,并除以10000,获得当前的时间,单位为10秒。由于网络传输需要一定时间,因此服务端需要考虑传输对时间戳的影响。如:假如浏览器发送请求时的时间为40000毫秒,除以10000后取整的结果为4,单位为10秒,此时假如服务器接到请求是的时间为59000毫秒,除以10000取整后为5。考虑到网络传输,本系统在服务器端生成了两个密码摘要,一个是以时间戳为5生成的,一个是以时间戳为5-1=4生成的。只要客户端的密码摘要和服务器端两个密码摘要中的一个相等,用户即可登录。故该设计允许用户请求提交的范围为40到59,故该摘要的的最大有效时间为59-40=19秒,最小时间为59-49=10秒。
4.登录设计创新
在用户登录过程中,由于验证码是以图片形式传输的,因此可以有效避免黑客通过程序来获得验证码内容,同时系统采用的短时间戳设计,能缩减密码摘要的有效时间。而这两种方法的融合能有效防止黑客通过程序或手动抓取http协议包从而实现非法登录系统。因此本系统能有效防止首部篡改和重放攻击。在一定程度上能给攻击者造成很大的障碍,从而达到保护系统的目的。
【原创作品,转载请注明出处】
【来源:天津工业大学2014届本科生毕业论文(设计)——基于高校PDF电子书及论文的在线分享阅读系统的设计与实现】
【2014-5-28】【WEGOTEAM】
用户登录具体实现与安全防范相关推荐
- ubuntu下如何查看用户登录及系统授权相关信息【转】
转自:http://www.tuicool.com/articles/ia67Bj 如何在ubuntu下查看相关用户登录历史,进行系统的日志跟踪和分析,以便发现系统登录问题,进行安全策略防护呢?ubu ...
- Vue项目中实现用户登录及token验证
一.什么是token token的意思是"令牌",是服务端生成的一串字符串,作为客户端进行请求的一个标识.当用户第一次登录后,服务器生成一个token并将此token返回给客户端, ...
- 【php增删改查实例】第十七节 - 用户登录(1)
新建一个login文件,里面存放的就是用户登录的模块. <html><head><meta charset="utf-8"><style ...
- centos5.6 (64bit)编译安装vsftpd-2.3.4的配置(两种用户登录)[连载之电子商务系统架构]...
centos5.6 (64bit)编译安装vsftpd-2.3.4的配置(两种用户登录) 出处:http://jimmyli.blog.51cto.com/我站在巨人肩膀上Jimmy Li 作者:Ji ...
- 基于jwt的用户登录认证
最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...
- java实现用户登录注册功能(用集合框架来实现)
需求:实现用户登录注册功能(用集合框架来实现) 分析: A:需求的类和接口 1.用户类 UserBean 2.用户操作方法接口和实现类 UserDao UserDaoImpl 3.测试类 UserTe ...
- scrapy模拟用户登录
scrapy框架编写模拟用户登录的三种方式: 方式一:携带cookie登录,携带cookie一般请求的url为登录后的页面,获取cookie信息应在登录后的页面获取,cookie参数应转成字典形式 # ...
- BOS项目 第2天(BaseDao、BaseAction、用户登录、自定义strust登录拦截器)
BOS项目 第2天 今天内容安排: 1.根据提供的pdm文件生成sql 2.持久层和表现层设计---BaseDao.BaseAction 3.实现用户登录功能 4.jQuery EasyUI 消息提示 ...
- 美多商城之用户登录(账号登录)
一.账号登录 1.1用户名登录 1. 用户名登录逻辑分析 2. 用户名登录接口设计 [仍在user子项目中] 1.请求方式 选项 方案 请求方法 POST 请求地址 /login/ urls.py ...
最新文章
- php表单偶数变颜色,利用CSS3 nth-child()选择器 实现表格奇偶行变色
- VS项目中引入dll的方法
- JAVA变量path , classpth ,java_home设设置作用和作用
- 隐马尔可夫HMM中viterbi算法
- 20170804 - 今日技能封装 - Q
- pandas loc 正则匹配字符串_一场pandas与SQL的巅峰大战(二)
- 1064. 朋友数(20)
- 东京组委会“友情提示”:奖牌是用回收金属做的不能吃!别咬了
- 赠书 | 读懂 x86 架构 CPU 虚拟化,看这文就够了
- 黑马程序员_7k面试题交通管理系统
- python字符画太小_python小项目(-)图片转字符画
- 递归的经典例子 java_java递归算法经典实例
- 惠普1020打印机查看已打印页数
- scan VIP listener 详解
- Oracle内置函数-字符/数值/日期/转换/NVL/分析函数与窗口函数/case_decode
- 基于微信小程序奶茶店在线点单管理系统#毕业设计
- 微信添加地址时选择地区功能是怎么实现的
- 再论关于如何学习网络编程
- glob.glob()
- css超出部分...样式或者多行...
热门文章
- Rotary Knob Slider
- 从Camtasia Studio生成的课件看SCORM
- Linux服务器集群性能监控之Performance Co-Pilot(PCP)部署
- aix系统oracle客户端配置文件,oracle客户端的配置
- TDOA算法综述--(2)--Chan‘s Method
- Chariot测试LAN->WAN/WAN->LAN
- 2023东南大学计算机考研经验分享
- 使用jar命令替换jar包中指定文件
- 洛谷 P4269 / loj 2041 [SHOI2015] 聚变反应炉 题解【贪心】【DP】
- 一个封装的BeanCopier工具类