密码加密

作者: 爱撒谎的男孩 | 来源:发表于2018-10-07 22:29 被阅读32次

密码加密

消息摘要(数据的指纹)

定义

  • 对不固定的消息(字符串,一段文本,一个文件),通过一种特定的算法,得到一个固定长度的文本,固定长度的文本叫做消息摘要
  • 比如我是程序员经过特定的算法之后,得到了消息摘要为: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);  //调用修改的方法
            }
        }   
    }

相关文章

  • 4-对称加密

    对称加密与非对称加密 按照密钥的特征不同, 密码体制分为对称密码体制和非对称密码体制。对称加密和非对称加密都是可逆...

  • 前端学习笔记十九-MongoDB+Express开发项目知识点

    一、密码加密 bcrypt 哈希加密是单程加密方式:1234 => abcd在加密的密码中加入随机字符串可以增加密...

  • 密码学及iOS签名(一) —— 加密解密

    加密解密类型 对称加密 公钥密码(非对称加密) 对称加密(常见的DES、 3DES、AES) 在对称密码中,加密、...

  • 文件/文件夹加密操作

    给 PDF 添加密码保护 你可以给 PDF 添加密码,这样每个人都需要输入密码才能打开该文件。密码用于加密文件。 ...

  • 前后端数据传输安全——加密浅析

    加密 本文内容: 密码学起源 古典密码学 现代密码学 对称加密 非对称加密 数字签名 哈希 密码学起源: 在战争中...

  • Node功能型第三方模块

    1. 密码加密 bcrypt 哈希加密是单程加密方式:1234 => abcd 在加密的密码中加入随机字符串可以增...

  • 密码技术(六)之混合密码

    混合密码  混合密码用对称密码来加密明文,用公钥密码来加密对称密码中所使用密钥。通过使用混合密码系统,就能够在通信...

  • 2019-01-09

    Spring-security的密码加密器 springsecurity推荐的密码加密器:...

  • day9-用户和组(2)

    密码 1. 为新用户添加密码(只有root才能执行) 交互式添加密码 非交互式添加密码 通过脚本,批量添加用户 2...

  • bcrypt

    密码加密

网友评论

    本文标题:密码加密

    本文链接:https://www.haomeiwen.com/subject/ewvraftx.html