登录功能(MD5加密)
登录这个功能,是不管哪个项目都会用到的,登录做的好坏,安全性的保障将直接影响到整个系统的成败,尤其是一些安全性要求比较严格的项目
1.首先需要对密码进行加密,这里用到的是md5加密,需要在login.html所在页面引入jQuery.md5.js
<!DOCTYPE html>
<html>
<head>
<title>登录页面</title>
<meta http-equiv="content-Type" content="text/html" charset="utf-8">
<meta name="renderer" content="webkit|ie-comp|ie-stand">
<meta name="keywords" content="XXXXXXXXXXX"/>
<meta name="description" content="XXXXXXXXXXXXXXXXXXXXXX"/>
<link rel="stylesheet" type="text/css" href="${ctxPath}/resources/css/login.css">
<link rel="stylesheet" type="text/css" href="${ctxPath}/resources/css/layer.css">
<script type="text/javascript" src="${ctxPath}/resources/js/JavaScript.js"></script>
<script type="text/javascript" src="${ctxPath}/resources/js/jquery/jquery.min.js"></script>
<script type="text/javascript" src="${ctxPath}/resources/js/jquery/jQuery.md5.js"></script>
<script type="text/javascript" src="${ctxPath}/resources/js/validate.js"></script>
<script type="text/javascript" src="${ctxPath}/resources/js/tab.js"></script>
<script type="text/javascript" src="${ctxPath}/resources/js/newLoginDefault.js"></script>
<script type="text/javascript">
var returnUrl='${returnUrl!}';
</script>
<script type="text/javascript" src="${ctxPath}/resources/js/layer/layer.js"></script>
<script type="text/javascript" src="${ctxPath}/resources/js/popwin.js"></script>
<script type="text/javascript" src="${ctxPath}/resources/js/newlogin.js"></script>
</head>
<body>
<input type="hidden" id="loginFrame" value="loginFrame">
<input type="hidden" id="rootPath" value="${ctxPath}">
<form id="login" action="" method="post" class="mainForm mainForm1" style="display:block">
<!-- <img src="${ctxPath}/resources/images/guanbi.png" id="close" alt="" /> -->
<div class="container">
<div class="number">
<span>登录<span>
</div>
<div class="normalInput">
<input type="text" class="phone" id="phone" name="phone" onBlur="CheckEmpty()" placeholder="请输入手机号/用户名/邮箱" onkeyup="value=value.replace(/\s/g,'')">
<input id="sign" name="sign" type="hidden"/>
</div>
<span class="error error1"></span>
<span class="error error2"></span>
<div class="normalInput">
<input type="text" class="password" id="pass" name="password" maxlength="16" autocomplete="off" placeholder="请输入密码" onkeyup="value=value.replace(/\s/g,'')" style="display: none;width:280px">
<input type="password" class="password1" id="pass1" name="password1" maxlength="16" autocomplete="off" placeholder="请输入密码" onkeyup="value=value.replace(/\s/g,'')" style="display: inline-block;width:280px">
<input hidden="hidden" type="text" id="hiddenPass"/>
<a id="pwdBtn" href="##" class="pwdBtnShow" isshow="true">
<i class="i_icon" style="background-position: -60px -93px;"></i>
</a>
</div>
<span class="error error3"></span>
<a id="loginOnclick" href="javascript:" onclick="login(0)" class="fullBtnBlue">登录</a>
<a target="_Blank" href="${ctxPath}/toRestpwds.htm" class="forget">忘记密码?</a>
</div>
<p>还没有账号? <a href="#" class="register">免费注册</a></p>
</form>
<script>
$("#close").click(function(){
$(".mainForm1").hide();
}) $('.register').unbind();
$('.register').click(function(){
var index = parent.layer.getFrameIndex(window.name);
parent.layer.open({
type: 2,
title: '',
shadeClose: false,
shade: 0.5,
area: ['445px','374px'],
content: '${request.contextPath}/registers.htm'
});
parent.layer.close(index);
}); //为keyListener方法注册按键事件
document.onkeydown=keyListener;
function keyListener(e){
// 当按下回车键,执行我们的代码
if(e.keyCode == 13){
document.getElementById("loginOnclick").onclick();
}
}
</script>
</body>
</html>
2.再来看一下这个newlogin.js,注意对输入手机号和密码的加密(md5加密),hiddenPass和sign,从安全性来说这里是值得借鉴的,其他的代码也一并粘出来吧,方便以后学习和借鉴。
function login(num){
// $("#l_tips").attr("style","display:block");
// $("#logMsg").html("密码不能为空!"); reg1=/^.*[\d]+.*$/;
reg2=/^.*[A-Za-z]+.*$/;
reg3=/^.*[_@#%&^+-/*\/\\]+.*$/;//验证密码
if($(".pwdBtnShow").attr("isshow")=="false")
{
var Pval = $(".password").val();
}
else
{
var Pval = $(".password1").val();
} if( Pval =="")
{
$(".password").parent().addClass("errorC");
$(".error3").html("请填写密码!");
$(".error3").css("display","block");
$(".error1").css("display","none");
$(".error2").css("display","none");
return false;
} //注册具体方法
// var PWD = $(".password").val().trim();
// var PWD1 = $(".password1").val().trim();
// if(PWD.length >= PWD1.length){
// $("#hiddenPass").val($.md5(PWD));
// }else{
// $("#hiddenPass").val($.md5(PWD1));
// }
$("#hiddenPass").val($.md5(Pval));
$("#sign").val($.md5($("#phone").val()+$("#hiddenPass").val())); var flag='';
if(null!=$("#flag").val()){
flag="?flag="+$("#flag").val();
}
$("#loginOnclick").html("登录中...");
$('#loginOnclick').css('background-color','#ccc');
$('#loginOnclick').removeAttr('onclick');
if(num==0){
$.ajax({
type : "POST",
url : "ssl/logins.htm",
dataType : "json",
async : false,
data:{
"j_password" : $("#hiddenPass").val(),
"j_username" : $("#phone").val(),
"sign" : $("#sign").val(),
"afs_scene":$("#afs_scene").val(),
"afs_token":$("#afs_token").val(),
},
success : function(data) {
var pathName=window.document.location.pathname; var projectName=pathName.substring(0,pathName.substr(1).indexOf('/')+1);
if(projectName!="/puhuilicai"){
projectName="";
}
if (data.msg == 2){//成功返回
if(data.isRisk=='yes'){//进行风险拦截
$("iframe",window.parent.document).attr("src",projectName+"/toLogins.htm");
}else{
if(data.isFirstLogin=='no'){//登录送奖励 判断是否当天第一次登录
if(window.top==window.self){ //不存在父页面
window.location.href="https://www.baidu.com";
}else{
if(returnUrl!=''){//未登录情况下请求拦截页面
var index = parent.layer.getFrameIndex(window.name);
parent.location.href=returnUrl;
parent.layer.close(index);
}else{ //mxl
var aa=window.parent.location + '';
if(aa.indexOf('toRestpwd.htm') == -1
&& aa.indexOf('toRestpwds.htm') == -1
&& aa.indexOf('toRestpwd2.htm') == -1
&& aa.indexOf('toRestpw3.htm') == -1
//&& aa.indexOf('toRestpw4.htm') == -1
){
//提示层
parent.location.reload();
}
else{
//parent.location.href="https://www.baidu.com";
parent.location.href="index.htm";
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
} }
}
}else{//第一次登录当奖励窗口 //mxl
var aa=window.parent.location + '';
if(aa.indexOf('toRestpwd.htm') == -1
&& aa.indexOf('toRestpwds.htm') == -1
&& aa.indexOf('toRestpwd2.htm') == -1
&& aa.indexOf('toRestpw3.htm') == -1
//&& aa.indexOf('toRestpw4.htm') == -1
){
//提示层
var voucherName=data.voucherName.replace("%","*");
var index = parent.layer.getFrameIndex(window.name);
parent.$("#frame_top").load(projectName+"/frame_top.htm");
popWin.showWin("880","840","xxxx",projectName+"/ssl/loginSuccess.htm?integral="+data.integral+"&totalIntegral="+data.totalIntegral+"&loginDays="+data.loginDays+"&voucherName="+voucherName);
parent.layer.close(index); }
else{ //parent.location.href="https://www.baidu.com";
parent.location.href="index.htm";
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
} }
}
}else if(data.msg==1){
if(data.isRisk=='yes'){//进行风险拦截
$("iframe",window.parent.document).attr("src",projectName+"/toLogins.htm");
}else{
if(data.isFirstLogin=='no'){//登录送奖励 判断是否当天第一次登录
if(window.top==window.self){ //不存在父页面
window.location.href="https://www.baidu.com";
}else{
if(returnUrl!=''){//未登录情况下请求拦截页面
var index = parent.layer.getFrameIndex(window.name);
parent.location.href=returnUrl;
parent.layer.close(index);
}else{
parent.location.reload();
}
}
}else{//第一次登录当奖励窗口
var voucherName=data.voucherName.replace("%","*");
var index = parent.layer.getFrameIndex(window.name);
parent.$("#frame_top").load(projectName+"/frame_top.htm");
popWin.showWin("880","840","普惠理财",projectName+"/ssl/loginSuccess.htm?integral="+data.integral+"&totalIntegral="+data.totalIntegral+"&loginDays="+data.loginDays+"&voucherName="+voucherName);
parent.layer.close(index);
}
}
}else if(data.msg==-1){
// $("#loginPhone").text("账号不存在");
// $("#phone").val("");
// $("#pass").val(""); $(".phone").parent().removeClass("checkedN");
$(".phone").parent().addClass("errorC");
$(".error1").html("账号不存在");
$(".error1").css("display","block");
$(".error2").css("display","none");
$(".error3").css("display","none");
$("#loginOnclick").html("登录");
$('#loginOnclick').css('background-color','#ed5345');
$('#loginOnclick').attr('onclick','login(0)');
}else{
// $("#loginPass").text("用户名或密码不正确!");
// $("#pass").val("");
$(".password").parent().addClass("errorC");
$(".error3").html("用户名或密码不正确!");
$(".error3").css("display","block");
$(".error1").css("display","none");
$(".error2").css("display","none");
$("#loginOnclick").html("登录");
$('#loginOnclick').css('background-color','#ed5345');
$('#loginOnclick').attr('onclick','login(0)');
} }
});
}else{
$.ajax({
type : "POST",
url : "ssl/logins.htm",
dataType : "json",
async : false,
data:{
"j_password" : $("#pass").val(),
"j_username" : $("#phone").val(),
"sign" : $("#sign").val(),
"sig":$("#sig").val(),
"token":$("#token").val(),
"sessionId":$("#sessionId").val()
},
//data : $('#form').serialize(),
success : function(data) {
var pathName=window.document.location.pathname;
var projectName=pathName.substring(0,pathName.substr(1).indexOf('/')+1);
if(projectName!="/puhuilicai"){
projectName="";
}
if (data.msg == 2){
if(data.isRisk=='yes'){//进行风险拦截
$("iframe",window.parent.document).attr("src",projectName+"/toLogins.htm");
}else{
if(data.isFirstLogin=='no'){
if(window.top==window.self){ //不存在父页面
window.location.href="https://www.baidu.com";
}else{
if(returnUrl!=''){
var index = parent.layer.getFrameIndex(window.name);
parent.location.href=returnUrl;
parent.layer.close(index);
}else{
parent.location.reload();
}
}
}else{
var voucherName=data.voucherName.replace("%","*");
var index = parent.layer.getFrameIndex(window.name);
popWin.showWin("880","840","xxxx",projectName+"/ssl/loginSuccess.htm?integral="+data.integral+"&totalIntegral="+data.totalIntegral+"&loginDays="+data.loginDays+"&voucherName="+voucherName);
parent.layer.close(index);
}
}
}else if(data.msg==1){
window.location.href="ssl/account/toEntCenter.htm";
}else if(data.msg==-1){
$("#loginPhone").text("账号不存在");
$("#phone").val("");
$("#pass").val("");
}else{
$("#loginPass").text("用户名或密码不正确!");
$("#pass").val(""); }
}
});
}
return false;
}
function CheckEmpty(){
if($.trim($("#phone").val())==""){ //$("#loginPhone").text("账号不能为空");
$(".phone").parent().addClass("errorC");
$(".error1").html("账号不能为空");
$(".error1").css("display","block");
$(".error2").css("display","none");
$(".error3").css("display","none");
return false;
}else{
//$("#loginPhone").text("");
$(".phone").parent().addClass("checkedN");
}
}
3.上面js中手机号和密码加密得到的sign有什么用呢,下面在Controller中看一下
@ResponseBody
@RequestMapping(value="/ssl/logins",method = RequestMethod.POST)
public Map<String, String> logins(String afs_scene,String afs_token,String sig,String sessionId,String token,String sign,String j_username,String j_password,HttpServletRequest request,HttpSession session){
CustUser custUser = null;
Map<String,String> map = new HashMap<String, String>(1);
String flag = "0"; //失败
//连续登录天数
String loginDays = "1";
//增加的积分数
String integral ="0";
//是否每天第一次登录
String isFirstLogin ="yes";
//卡券名称
String voucherName ="0.1% 加息券";
//是否风险用户
String isRisk="no";
try{
if(signValidate(j_username,j_password,sign)){
custUser = userRegisterService.getCustUserByAccountAndPassowd(j_username.toLowerCase().trim(),j_password);
if(custUser!=null){ flag = custUser.getCustType().toString();
if("no".equals(isRisk)){
Long loginTime =null;
CustUserLogin custUserLogin = userRegisterService.getLastLoginTime(custUser.getId());
//判断是否每天第一次登录
Map<String,String> result = userRegisterService.saveFirstLoginHandle(request, custUser, custUserLogin);
loginDays=result.get("loginDays");
isFirstLogin=result.get("isFirstLogin");
voucherName=result.get("voucherName");
loginTime = Long.valueOf(result.get("loginTime"));
integral = result.get("integral"); custUser.setLoginTime(loginTime);
if (custUser.getUserName().equals("")) {
session.getServletContext().setAttribute(custUser.getMobile(),loginTime);
}else{
session.getServletContext().setAttribute(custUser.getUserName(),loginTime);
}
//对存入数据库中的密码进行解密放到session中-zzj-2016-4-7 14:31:42
//custUser.setPassword(PassUtil.decode(custUser.getPassword()));
session.setAttribute(Constants.USER,custUser);
session.setAttribute(Constants.MOBILE_NUM,1);
map.put("userId", custUser.getId().toString());
} Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$");
Matcher m = p.matcher(custUser.getUserName());
if(m.matches()){
String phone = custUser.getUserName() ;
phone = phone.substring(0,3) + "****" + phone.substring(7, phone.length());
session.setAttribute("userName", phone);
}else{
session.setAttribute("userName", custUser.getUserName());
} }else{ if(null==userRegisterService.getCustUserByMobile(j_username.trim()))
{
flag = "-1"; }
isFirstLogin="no";
}
}
}catch(Exception e){
logger.info(e.getMessage());
map.put("msg", "0");
return map;
}
//风险识别
map.put("isRisk",isRisk);
map.put("msg", flag);
map.put("isFirstLogin", isFirstLogin);
map.put("loginDays", loginDays);
map.put("integral", integral);
if("yes".equals(isFirstLogin)){
map.put("totalIntegral", integralService.getIntegralByUserId(custUser.getId()).toString());
map.put("voucherName", voucherName);
} return map;
}
4.signValidate方法中,再一次对手机号和密码还要sign进行校验,具体看一下signValidate这个方法
/* 登录完整性验证
* @param sign
* @return
*/
private boolean signValidate(String account,String password,String sign){
StringBuffer signInfo = new StringBuffer();
signInfo.append(account);
signInfo.append(password);
return sign.equals(DigestUtils.md5Hex(signInfo.toString()));
}
public static String md5Hex(final byte[] data) {
return Hex.encodeHexString(md5(data));
}
public static String encodeHexString(final byte[] data) {
return new String(encodeHex(data));
} public static char[] encodeHex(final byte[] data) {
return encodeHex(data, true);
}
public static byte[] md5(final String data) {
return md5(StringUtils.getBytesUtf8(data));
}
public static byte[] getBytesUtf8(final String string) {
return getBytes(string, Charsets.UTF_8);
}
登录这块还要很多功能在这里就不细说了,我主要是觉得这里的加密和检验工作做得比较好,记录一下,方便以后的使用和学习。
登录功能(MD5加密)的更多相关文章
- ASP.NET会员注册登录模块(MD5加密,Parameters防止SQL注入,判断是否注册)
MD5加密,Parameters防止SQL注入: protected void btnLog_Click(object sender, EventArgs e) { //获取验 ...
- SpringSecurity 登录 - 以及Md5加密
我们现在开放一个链接给其他系统,来访问我们的系统 http://localhost:8080/hulk-teller-web/haihui!init.jspa?loginId=teller01& ...
- nodejs 用户登录密码md5加密
jade文件 div.login ul.inp-content li span= '用户名:' input.ui-input1#input1(placeholder='请输入手机号') li sp ...
- 登录之md5加密
语句: password = hex_md5(password); 引入js文件: md5.js: /* * A JavaScript implementation of the RSA Data S ...
- 系统开发中使用拦截器校验是否登录并使用MD5对用户登录密码进行加密
项目名称:客户管理系统 项目描述: 项目基于javaEE平台,B/S模式开发.使用Struts2.Hibernate/Spring进行项目框架搭建.使用Struts中的Action 控制器进行用户访问 ...
- 自己Cookie写的自动登录功能 包含BASE64 和MD5的使用
sql表 username password字段 User类 有 id username password等字段 Service有一函数 @Override public User findUser ...
- Apache Shiro(三)-登录认证和权限管理MD5加密
md5 加密 在前面的例子里,用户密码是明文的,这样是有巨大风险的,一旦泄露,就不好了.所以,通常都会采用非对称加密,什么是非对称呢?就是不可逆的,而 md5 就是这样一个算法.如代码所示 123 用 ...
- MD5工具类,提供字符串MD5加密、文件MD5值获取(校验)功能
MD5工具类,提供字符串MD5加密(校验).文件MD5值获取(校验)功能 : package com.yzu.utils; import java.io.File; import java.io.Fi ...
- 一个简单的后台与数据库交互的登录与注册[sql注入处理,以及MD5加密]
一.工具: vs2013[因为我现在用的也是2013,版本随便你自己开心] sql2008[准备过久升级] 二.用到的语言: HTML+CSS+Jquery+Ajax+sqlserver HTML[相 ...
随机推荐
- 2017-07-01(ifconfig ifdown ifup netstat )
ifconfig 可以查看IP地址与子网掩码 ifdown(禁用网卡) ifdown 网络设备名 ifdown eth0 ifup (启动网卡) ifup 网络设备名 ifup eth0 net ...
- 摘-BMC自动化解决方案产品概览
以下内容摘自BMC解决方案白皮书 BMC 解决方案助力您的企业快速享受自动化带来的快速效益,并随时间推移实现这些优势的最大化. BMC 自动化技术可帮助您优化敏捷性,同时保持必要的治理和合规性控制.无 ...
- Servlet--ServletRequest接口,ServletResponse接口
ServletRequest接口 定义 public interface ServletRequest 定义一个 Servlet 引擎产生的对象,通过这个对象, Servlet 可以获得客户端请求的数 ...
- 通过反编译深入理解Java String及intern(转)
通过反编译深入理解Java String及intern 原文传送门:http://www.cnblogs.com/paddix/p/5326863.html 一.字符串问题 字符串在我们平时的编码工作 ...
- 前端自动化测试神器-Katalon的基础用法
前言 最近由于在工作中需要通过Web端的功能进行一次大批量的操作,数据量大概在5000左右,如果手动处理, 完成一条数据的操作用时在20秒左右的话,大概需要4-5个人/天的工作量(假设一天8小时的工作 ...
- AWS认证权威考经(助理级认证篇)
笔者作为AWS官方认证的早期通过者,已经拿到了AWS的助理级解决方案架构师.开发者认证,系统管理员认证.这几年也陆续指导公司多人通过AWS的认证.本篇文章将分享如何通过自学的方式轻松通过AWS的助理级 ...
- PMS 启动流程
1.在SystemServer中启动PackageManagerService.main 2.newPackageManagerService()并添加到ServiceManager中 3.newin ...
- R 调用 python
上一篇说了python使用 rpy2 调用 R,这里介绍R如何调用python.R的强项在于统计方面,尤其是专业的统计分析,统计检验以及作图功能十分强大,但是在通用性方面,就远不如Python了,比如 ...
- CentsOS7无网情况下安装mysql5.7
1.需求就不用讲了,客户现场,政府环境,银行环境,大多是没网的,所以无网安装是很有必要的 mysql下载路径:https://dev.mysql.com/downloads/mysql/ 查看自己Li ...
- select标签实现二级联动
效果如下图所示: 实现的原理:使用onchange事件,原理见代码 html代码: <select id="select" class="sel"> ...