1. 加密算法MD5介绍
1、什么是MD5
MD5加密全程是Message-Digest Algoorithm 5(信息-摘要算法),它对信息进行摘要采集,再通过一定的位运算,最终获取加密后的MD5字符串。
2、MD5有哪些特点
MD5加密的特点主要有以下几点:
1、针对不同长度待加密的数据、字符串等等,其都可以返回一个固定长度的MD5加密字符串。(通常
32位的16进制字符串);
2、其加密过程几乎不可逆,除非维护一个庞大的Key-Value数据库来进行碰撞破解,否则几乎无法解 开。
3、运算简便,且可实现方式多样,通过一定的处理方式也可以避免碰撞算法的破解。(加盐:随机字 符串)
4、对于一个固定的字符串。数字等等,MD5加密后的字符串是固定的,也就是说不管MD5加密多少 次,都是同样的结果。
2. Java代码中如何使用MD5
2.1 添加依赖
<!--MD5依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.3</version>
</dependency>
2.2 添加工具类
package com.lagou.utils;
import org.apache.commons.codec.digest.DigestUtils;
public class Md5 {
public final static String md5key = "lagou";
/**
* MD5方法
* @param text 明文 123456
* @param key 密钥 lagou
* @return 密文
* @throws Exception
*/
public static String md5(String text, String key) throws Exception {
//加密后的字符串
String encodeStr= DigestUtils.md5Hex(text+key);
System.out.println("MD5加密后的字符串为:encodeStr="+encodeStr);
return encodeStr;
}
/**
* MD5验证方法
* @param text 明文
* @param key 密钥
* @param md5 密文
* @return true/false
* @throws Exception
*/
public static boolean verify(String text, String key, String md5) throws Exception {
//根据传入的密钥进行验证
String md5Text = md5(text, key);
if(md5Text.equalsIgnoreCase(md5))
{
System.out.println("MD5验证通过");
return true;
}
return false;
}
public static void main(String[] args) throws Exception {
// 注册 用户名:tom 密码:123456
// 添加用户的时候,要将明文密码转换成密文密码
String lagou = Md5.md5("123456", "lagou");
System.out.println(lagou);
// 登陆 用户名:tom 密码:123456
// 1. 根据前台传递过来的用户名tom先在user表中查询出对应的密文密码
// select * from user where username = tom
// 2.调用 verify 方法进行密码的校验
boolean verify = Md5.verify("123456", "lagou", "f00485441dfb815c75a13f3c3389c0b9");
System.out.println(verify);
}
}
2.3 Service层:UserService的编写
package com.lagou.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lagou.dao.UserMapper;
import com.lagou.domain.*;
import com.lagou.service.UserService;
import com.lagou.utils.Md5;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
/*
用户登陆
*/
@Override
public User login(User user) throws Exception {
// 1.调用mapper方法 user2:包含了密文密码
User user2 = userMapper.login(user);
if(user2 !=null && Md5.verify(user.getPassword(),"lagou",user2.getPassword())){
return user2;
}else {
return null;
}
}
}
2.4 Web层:UserController
package com.lagou.controller;
import com.github.pagehelper.PageInfo;
import com.lagou.domain.ResponseResult;
import com.lagou.domain.Role;
import com.lagou.domain.User;
import com.lagou.domain.UserVo;
import com.lagou.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/*
用户分页&多条件组合查询方法
*/
@RequestMapping("/findAllUserByPage")
public ResponseResult findAllUserByPage(@RequestBody UserVo userVo){
PageInfo pageInfo = userService.findAllUserByPage(userVo);
return new ResponseResult(true,200,"分页多条件查询成功",pageInfo);
}
/*
用户登陆
*/
@RequestMapping("/login")
public ResponseResult login(User user, HttpServletRequest request) throws Exception {
User user1 = userService.login(user);
if(user1 !=null){
// 保存用户id及access_token到session中
HttpSession session = request.getSession();
String access_token = UUID.randomUUID().toString();
System.out.println(access_token);
session.setAttribute("access_token",access_token);
session.setAttribute("user_id",user1.getId());
// 将查询出来的信息响应给前台
Map<String, Object> map = new HashMap<>();
map.put("access_token",access_token);
map.put("user_id",user1.getId());
// 将查询出来的user,也存到map中
map.put("user",user1);
return new ResponseResult(true,1,"登陆成功",map);
}else {
return new ResponseResult(true,400,"用户名密码错误",null);
}
}
/*
分配角色(回显)
*/
@RequestMapping("/findUserRoleById")
public ResponseResult findUserRelationRoleById(Integer id){
List<Role> roleList = userService.findUserRelationRoleById(id);
return new ResponseResult(true,200,"分配角色回显成功",roleList);
}
/*
分配角色
*/
@RequestMapping("/userContextRole")
public ResponseResult userContextRole(@RequestBody UserVo userVo){
userService.userContextRole(userVo);
return new ResponseResult(true,200,"分配角色成功",null);
}
/*
获取用户权限,进行菜单动态展示
*/
@RequestMapping("/getUserPermissions")
public ResponseResult getUserPermissions(HttpServletRequest request){
// 1.获取请求头中的token
String header_token = request.getHeader("Authorization");
// 2.获取session中token
String session_token = (String) request.getSession().getAttribute("access_token");
// 3.判断token是否一致
if(header_token.equals(session_token)){
// 获取用户id
Integer user_id = (Integer) request.getSession().getAttribute("user_id");
// 调用service,进行菜单信息查询
ResponseResult responseResult = userService.getUserPermissions(user_id);
return responseResult;
}else {
ResponseResult responseResult = new ResponseResult(false, 400, "获取菜单信息失败", null);
return responseResult;
}
}
}
节选自拉钩教育JAVA系列课程