发表于: 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。


返回列表 返回列表
评论

    分享到