Java技术专题程序员

密码加密

2018-10-07  本文已影响32人  爱撒谎的男孩

密码加密

消息摘要(数据的指纹)

定义

作用

特性

特定的算法

  1. MD5
  2. 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);
    }

实例

密码的安全性处理

实现

/**
 * 密码加密的类
 * @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);  //调用修改的方法
            }
        }   
    }
上一篇 下一篇

猜你喜欢

热点阅读