发表于: 2017-12-12 21:45:13
1 669
今天完成的事情:
今天完成了MD5加盐加密,把用户ID与登录时间一起加密生成token放入cookie中。先贴代码。
/**
* MD5加密(password+salt) 但是每一次检测生成的salt不一样,无法登录。
* 如果想实现加盐后的登录,则需要一个协定的salt。存放在服务端,每次客户端传入数据都去调用对应的salt。
* 这里在本地生命了一个固定的slat
*/
public static String getMD5(String password){
//生成随机数
// Random r = new Random();
// //指定长度为16的字符串
// StringBuilder sb = new StringBuilder(16);
// sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
// if(sb.length()<16){
// for(int i=0;i<16-sb.length();i++){
// sb.append(i);
// }
// }
// String salt = sb.toString();
System.out.println("未增加随机数的password:"+password);
//String salt =sb.toString();//盐值
// System.out.println("随机数"+salt);
// password = MD5Util.getMD5(password+salt);
// System.out.println("增加随机数且MD5加密"+password);
// return password;
String salt = "1234123412341234";
password = password + salt ;
char hexDigits [] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
try{
System.out.println("增加salt后传入密码值为:"+password);
byte[] strTemp = password.getBytes();
// 生成一个MD5加密计算摘要
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
// 计算md5函数
mdTemp.update(strTemp);
byte[] md=mdTemp.digest();
int j=md.length;
//System.out.println(j);
char str[]=new char[j * 2];
int k=0;
for(int i=0;i<j;i++) {
//System.out.println("进入循环*******");
byte byte0=md[i];
str[k++]=hexDigits[byte0 >>> 4 & 0xf];
str[k++]=hexDigits[byte0 & 0xf];
}
//System.out.println("password"+password);
return new String(str);
}catch (Exception e){
e.printStackTrace();
return null;
}
}
@RequestMapping(value = "/newUser", method = RequestMethod.GET)
public String register(){
logger.info("注册界面");
return "register";
}
@RequestMapping(value = "/newUser", method = RequestMethod.POST)
public String forRegister(String name,String password){
logger.info("传入的姓名是:"+name);
logger.info("传入的密码为:"+password);
//前台表单如果不输入数据,直接提交,值是"",而不是NULL
if(name==null||name.trim().equals("")){
logger.info("姓名不能为空");
return null;
}else if(password==null||password.trim().equals("")){
logger.info("密码不能为空");
return null;
}else{
password= MD5UtilAndSalt.getMD5(password);
logger.info("加密后的密码为:"+password);
userService.addUser(name, password);
return "web";
}
}
/**
* @author Yong
* 一个简单的实现注册登录加密,检测登录状态的Demo。
* DES MD5
* **DES加密后生成二进制数组,需要转换为十六进制字符串然后存在cookie中。检测用户的登录状态。
*/
@RequestMapping(value = "/user",method = RequestMethod.GET)
public String admin(){
logger.info("进入登录界面");
return "web";
}
@RequestMapping(value = "/user",method = RequestMethod.POST)
public String forLogin(String name, String password, HttpServletRequest request, HttpServletResponse response, Model model){
logger.info("把用户输入密码执行MD5加密后进入用户身份判断");
System.out.println("登录是输入密码"+password);
password = MD5UtilAndSalt.getMD5(password);
System.out.println("登录时加密后密码为:"+password);
User user = userService.findByNameAndPassword(name,password);
if(user!=null){
String des = user.getId()+"+"+System.currentTimeMillis(); //这里使用了DES加密,把用户ID与登录时间转化为二进制数组进行加密。
logger.info("开始执行DES加密"); //加密后再把二进制转化为十六进制字符串存入到cookie中。
byte[] bytes = DESUtil.encrypt(des.getBytes(),"12345678");
logger.info("将数组转化为字符串");
String token = Transform.bytesToHexString(bytes);
System.out.println(token);
Cookie cookie = new Cookie("loginInfo",token);
System.out.println(cookie);
cookie.setMaxAge(24*60*60);
cookie.setPath("/");
response.addCookie(cookie);
logger.info("帐密正确");
return "hello";
}else {
logger.info("帐密错误");
return "web";
}
}
/**
*二进制与十六进制转换
/
public static void main(String[] args) {
String des ="李白"+"+"+ System.currentTimeMillis();
byte[] bytes = DESUtil.encrypt(des.getBytes(),"12345678");
String s = Transform.bytesToHexString(bytes);
System.out.println(s);
}
public static String bytesToHexString(byte[] bytes){
StringBuilder stringBuilder = new StringBuilder();
if(bytes==null||bytes.length<=0){
return "非法字符";
}
for(int i=0;i<bytes.length;i++){
int v = bytes[i] & 0xff;
String hv = Integer.toHexString(v);
if(hv.length()<2){
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
cookie的内容和控制台打印的token一致。
明天计划的事情:
做一下拦截器吧。
遇到的问题:
没太大问题。这一块儿的教程都还不错。
收获:
学习了MD5加密。DES加密。COOKIE。
评论