密码加密
消息摘要(数据的指纹)
定义
- 对不固定的消息(字符串,一段文本,一个文件),通过一种特定的算法,得到一个固定长度的文本,固定长度的文本叫做消息摘要
- 比如
我是程序员
经过特定的算法之后,得到了消息摘要为:adaf02515dfds7885csdfcdsc
作用
- 数据完整性的检验技术,我们将文本转换为消息摘要,然后比较消息摘要的值是否相等,如果相等那么表示两种文本相同
特性
特定的算法
- MD5
- SHA
实现步骤
添加依赖jar包
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
测试MD5Hex
@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); //调用修改的方法
}
}
}
网友评论