转载

Spring之密码加密

  • 对不固定的消息(字符串,一段文本,一个文件),通过一种特定的算法,得到一个固定长度的文本,固定长度的文本叫做消息摘要
  • 比如 我是程序员 经过特定的算法之后,得到了消息摘要为: adaf02515dfds7885csdfcdsc

作用

  • 数据完整性的检验技术,我们将文本转换为消息摘要,然后比较消息摘要的值是否相等,如果相等那么表示两种文本相同

特性

  • 不可逆的,不能从消息摘要再得到原来的文本

特定的算法

  1. MD5
  2. SHA

实现步骤

添加依赖jar包

  • commons-codec
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.10</version>
</dependency>

测试MD5Hex

  • 得到的是32位的16进制的字符串
@Test
	public void test1(){
		String str1="你们好,未来的程序员!";
		String strMessageString=DigestUtils.md5Hex(str1);
		System.out.println(strMessageString);
	}
	
//读取文件
	@Test
	public void test2()throws IOException{
		InputStream inputStream=new FileInputStream(new File("/home/chenjiabing/Documents/Blog/AOP.md"));
		String message=DigestUtils.md5Hex(inputStream);
		System.out.println(message);
	}

密码加密

  • 避免在数据库中明文保存密码,通过消息摘要技术对密码进行加密

明文

  • 没有加密的文字(字符串),能看懂的文字

密文

  • 经过加密后的文字(字符串),看不出来明文的意思

### 加盐处理 salt

  • 为了提高密码的安全性
  • 就是在用户的密码之后随便添加一个字符串,然后连接在一起生成摘要,那么即使获取摘要,也不会被破解
@Test
public void test3(){
	String str1="123456";
	String salt="这个是加盐处理";  //需要加盐,随便定义一个字符串
	String message=DigestUtils.md5Hex(str1+salt);  //获取加盐之后的消息摘要
	System.out.println(message);
}

实例

密码的安全性处理

  • 涉及到密码: 登录,注册,修改密码

实现

  • 创建一个 MD5Password工具 类,用于加密密码
/**
 * 密码加密的类
 * @author chenjiabing
 */
public class MD5Password{
	private final static String SALT="加油,骚年!";  //加盐处理
	
	/**
	 * 获取加密之后的密码
	 * @param password 用户输入的密码
	 * @return  加密之后的密码
	 */
	public static String getMd5Password(String password){
		return DigestUtils.md5Hex(password+SALT);  //使用了加盐处理
	}
}
  • 在注册的时候对输入的密码进行加密存储到数据库中
/**
	 * 注册
	 * 1. 调用selectUserByUserName(User user)方法判断用户名是否存在,返回对象u
	 * 2. 判断u是否为null,
	 * 3. 如果为null,调用insertUser(user)方法添加
	 * 4. 如果不为null,抛出异常提示controller用户名存在(UserNameAlreadyExistException)
	 */
	public void register(User user)throws UserNameAlreadyExistException {
		User u=userMapper.selectUserByUserName(user.getUsername());  //调用usermapper中的方法
		if (u!=null) {  //如果u不为null,表示用户名已经存在与数据库中,不可以再次注册了,因此抛出异常
			throw new UserNameAlreadyExistException("用户名已经存在,请重新输入!!!");
		}else {   //如果u==null,表示用户名不存在,可以添加
			//获取加密之后的密码
			String md5Password=MD5Password.getMd5Password(user.getPassword());
			//将加密之后的密码设置到user中,保存到数据库中
			user.setPassword(md5Password); 
			userMapper.insertUser(user);  //直接调用持久层方法插入数据即可
		}
	}
  • 在登录的时候,将用户输入的密码进行加密获取到加密之后的密码,然后和数据库中的密码比较
/**
	 * 登录方法
	 * 1. 通过selectUserByUserName返回user对象
	 * 2.判断user是否为null
	 * 3.如果user=null,抛出UserNotFoundException异常
	 * 4.如果user!=null,那么验证其中的密码是否正确
	 * 5.如果密码不匹配,抛出PassWordNotMatchException异常
	 * 6. 如果密码匹配,那么返回user对象
	 * @throws UserNotFoundException 
	 * @throws PassWordNotMatchException 
	 */
	public User login(String userName, String passWord)throws UserNotFoundException, PassWordNotMatchException {
		
		User user=userMapper.selectUserByUserName(userName);  //根据用户名查询,返回user对象
		if (user==null) {   //user为null,表示用户名不存在
			throw new UserNotFoundException("用户名不存在");
		}else {  //如果用户名存在,验证密码
			
			//获取加密之后的密码,实际是一个消息摘要
			String md5Password=MD5Password.getMd5Password(passWord);
			
			//使用加密之后获取的消息摘要和数据库中对应的密码比较
			if (md5Password.equals(user.getPassword())) {  //如果密码匹配
				return user;   //返回user对象即可
			}else {   //如果密码不相同,那么直接抛出密码不匹配的异常即可
				throw new PassWordNotMatchException("密码不匹配");
			}
		}
	}
  • 在修改中,将旧密码加密后和数据库中的密码比较,并且将新密码加密更新到数据库中
/**
	 * 修改密码
	 * 1. 根据id查询用户信息,返回user
	 * 2. 如果user=null,抛出用户不存在的异常
	 * 3. 如果user!=null,比较user中的密码和用户输入的旧密码oldPassword是否相同
	 * 4. 如果密码不相同,抛出密码不匹配的异常
	 * 5. 如果密码相同,表示用户输入的旧密码是正确的,那么更新密码即可 
	 */
	public void updatePassword(Integer id, String oldPassword,
			String newPassword) throws UserNotFoundException, PassWordNotMatchException {
		User user=userMapper.seletUserById(id);  //根据id查询,返回user对象
		if (user==null) {  //如果用户不存在
			throw new UserNotFoundException("当前登录的用户不存在");  //抛出用户不存在的异常
		}else {  //如果当前登录的用户存在
			//获取旧密码的加密之后的密码
			String oldMd5Password=MD5Password.getMd5Password(oldPassword);
			
			//使用加密之后的密码和数据库中的密码比较
			if (!user.getPassword().equals(oldMd5Password)) { //如果返回的user对象中的密码和用户输入的旧密码不匹配
				throw new PassWordNotMatchException("输入的旧密码不匹配");
			}else {  //如果输出的旧密码正确
				User u1=new User();   //创建User对象,封装修改所需的参数
				//获取加密之后的新密码
				String newMd5Password=MD5Password.getMd5Password(newPassword);
				
				u1.setPassword(newMd5Password);  //封装新密码,其中是加密之后的密码
				u1.setId(id);  //封装id
				userMapper.update(u1);  //调用修改的方法
			}
		}	
	}
原文  https://chenjiabing666.github.io/2018/05/21/Spring之密码加密/
正文到此结束
Loading...