用户登录具体实现与安全防范

原文地址:【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】

用户登录具体实现与安全防范相关推荐

  1. ubuntu下如何查看用户登录及系统授权相关信息【转】

    转自:http://www.tuicool.com/articles/ia67Bj 如何在ubuntu下查看相关用户登录历史,进行系统的日志跟踪和分析,以便发现系统登录问题,进行安全策略防护呢?ubu ...

  2. Vue项目中实现用户登录及token验证

    一.什么是token token的意思是"令牌",是服务端生成的一串字符串,作为客户端进行请求的一个标识.当用户第一次登录后,服务器生成一个token并将此token返回给客户端, ...

  3. 【php增删改查实例】第十七节 - 用户登录(1)

    新建一个login文件,里面存放的就是用户登录的模块. <html><head><meta charset="utf-8"><style ...

  4. centos5.6 (64bit)编译安装vsftpd-2.3.4的配置(两种用户登录)[连载之电子商务系统架构]...

    centos5.6 (64bit)编译安装vsftpd-2.3.4的配置(两种用户登录) 出处:http://jimmyli.blog.51cto.com/我站在巨人肩膀上Jimmy Li 作者:Ji ...

  5. 基于jwt的用户登录认证

    最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...

  6. java实现用户登录注册功能(用集合框架来实现)

    需求:实现用户登录注册功能(用集合框架来实现) 分析: A:需求的类和接口 1.用户类 UserBean 2.用户操作方法接口和实现类 UserDao UserDaoImpl 3.测试类 UserTe ...

  7. scrapy模拟用户登录

    scrapy框架编写模拟用户登录的三种方式: 方式一:携带cookie登录,携带cookie一般请求的url为登录后的页面,获取cookie信息应在登录后的页面获取,cookie参数应转成字典形式 # ...

  8. BOS项目 第2天(BaseDao、BaseAction、用户登录、自定义strust登录拦截器)

    BOS项目 第2天 今天内容安排: 1.根据提供的pdm文件生成sql 2.持久层和表现层设计---BaseDao.BaseAction 3.实现用户登录功能 4.jQuery EasyUI 消息提示 ...

  9. 美多商城之用户登录(账号登录)

    一.账号登录 1.1用户名登录 1. 用户名登录逻辑分析 2. 用户名登录接口设计   [仍在user子项目中] 1.请求方式 选项 方案 请求方法 POST 请求地址 /login/ urls.py ...

最新文章

  1. php表单偶数变颜色,利用CSS3 nth-child()选择器 实现表格奇偶行变色
  2. VS项目中引入dll的方法
  3. JAVA变量path , classpth ,java_home设设置作用和作用
  4. 隐马尔可夫HMM中viterbi算法
  5. 20170804 - 今日技能封装 - Q
  6. pandas loc 正则匹配字符串_一场pandas与SQL的巅峰大战(二)
  7. 1064. 朋友数(20)
  8. 东京组委会“友情提示”:奖牌是用回收金属做的不能吃!别咬了
  9. 赠书 | 读懂 x86 架构 CPU 虚拟化,看这文就够了
  10. 黑马程序员_7k面试题交通管理系统
  11. python字符画太小_python小项目(-)图片转字符画
  12. 递归的经典例子 java_java递归算法经典实例
  13. 惠普1020打印机查看已打印页数
  14. scan VIP listener 详解
  15. Oracle内置函数-字符/数值/日期/转换/NVL/分析函数与窗口函数/case_decode
  16. 基于微信小程序奶茶店在线点单管理系统#毕业设计
  17. 微信添加地址时选择地区功能是怎么实现的
  18. 再论关于如何学习网络编程
  19. glob.glob()
  20. css超出部分...样式或者多行...

热门文章

  1. Rotary Knob Slider
  2. 从Camtasia Studio生成的课件看SCORM
  3. Linux服务器集群性能监控之Performance Co-Pilot(PCP)部署
  4. aix系统oracle客户端配置文件,oracle客户端的配置
  5. TDOA算法综述--(2)--Chan‘s Method
  6. Chariot测试LAN->WAN/WAN->LAN
  7. 2023东南大学计算机考研经验分享
  8. 使用jar命令替换jar包中指定文件
  9. 洛谷 P4269 / loj 2041 [SHOI2015] 聚变反应炉 题解【贪心】【DP】
  10. 一个封装的BeanCopier工具类