发表于: 2017-11-03 22:55:01
1 790
今天完成的事情
1.解决DES加密token后的乱码问题
创建数据库,用于存储用户信息,当用户登陆时,在控制器中获取用户的用户名,通过用户名找到用户id,然后获取登陆时的时间戳,将用户id和时间戳组合在一起,中间加上 “ . ” 号用来分隔,得到一个字符串,用DES将字符串加密,得到的密文是一个字节数组,将字节数组转换为String字符串之后,再用DES进行解密会出现数据不足8位的报错:
而且将字节数组转换为字符串后,会显示为乱码:
要将其放入Cookie中的话,还是得转化为字符串,
尝试对加密后得到的字节数组解密,可以成功:
应该是转换为字符串的时候添加了某些不可见的字节
尝试用Base64对密文再进行一次编码,得到:
最后的 == 是编码方法用来填充空余位置,
将经过base64编码过的密文放入Cookie中,需要进行解密时,可以取出此字符串,用base64先解码一次,得到字节数组,用DES来解码字节数组,就可以得到原文。
加密过程:
User user =userService.get(name);
int user_id=user.getUser_id();
String user_id_s=String.valueOf(user_id);
long login_at=System.currentTimeMillis();
String login_at_s=String.valueOf(login_at);
String token2=user_id_s+"."+login_at_s;
byte[] aaa= DESEncryptTools.encrypt(token2.getBytes(),key.getBytes());
String tok=new String(aaa);
String tok1 = Base64.getEncoder().encodeToString(aaa);
经过Base64编码之后可以直接得到字符串。
解密过程:
byte[] tok2 = Base64.getDecoder().decode(tok1);
byte[] bbb= DESEncryptTools.decrypt(tok2,key.getBytes());
String s = new String(bbb);
先用base64解码,可以直接得到一个字节数组,将数组传入decrypt方法中,用DES进行解密,再次得到一个字节数组,最后将字节数组转换为字符串,即可与原来的数据进行比对,用来验证登陆信息。
2.写了一个注册页面,实现向数据库中添加新用户
首先建立一个用户表users
然后写了pojo,mapper,service等,
在jsp中写一个表单:
<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<form action="logon" method="post">
账号:<input type="text" name="user_name"><br>
密码:<input type="password" name="user_password"><br>
<input type="submit" value="注册">
</form>
请求提交后,在控制器中进行逻辑判断:
@RequestMapping("logon")
public String logon(User user, HttpServletRequest request, HttpServletResponse response){
String name = request.getParameter("user_name");
String password = request.getParameter("user_password");
if (null != userService.get(name)){
return "logon_fail";}
else{
user.setUser_name(name);
user.setUser_password(password);
userService.add(user);
return "redirect:/home";}
}
对用户名进行判断,如果从页面取得的用户名在数据库中已经存在,则跳转到失败页面,如果没有,则将获取的用户名和密码存入数据库中,并跳转到首页。
明天的计划
完成步骤一
遇到的问题
如上
收获
了解了token的生成及加密解密
评论