ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

小白学shiro

2021-07-31 12:01:43  阅读:209  来源: 互联网

标签:ResponseData 加密 密码 小白学 return shiro MD5


基于shiro加密的机制

基于shiro的加密机制

前言

通过shiro 的学习,可以发现其实shiro是能够进行加密的,他在里面你仅仅是shiro的基本框架 ,还包含了加密的一些包,在此处进行了对shiro 加密的简单、粗略的认识。

ps:回家了啥也不想干

shiro加密

我们知道。shiro提供了相应的验证机制,我们可以直接调用其方法就可以实现其验证用户、进行登录,也可以加上session,二者同时使用,但是如果进行了加密怎么做?如何加密?

加密方式:

最常见的加密方式就是MD5加密,这种加密方式有一个特点就是无法解密,但是也有一些网站能够进行解密,这种网站的解密方式就是非常的暴力,直接一个一个试,或者直接进行对比(数据库中有很多的数据,可以直接拿出来用),一般来说安全性比较高,且使用比较简单,因此这里使用MD5加密,如果你采用了shiro框架,那么MD5加密就可以直接使用,shiro已经集成了MD5加密所需要的包。

加密须知

加密的过程中我们需要提供 三个数据

  1. 需要加密的数据,一般来说是密码
  2. 散列的次数

我们采用的方法是MD5Hash的方法进行加密 其有三个参数: 需要加密的数据,盐,散列次数,如果是用于登陆的话,我们需要对盐有一定的要求,比如说:是随机的,不能是固定的,如果是固定的那么加盐的方法意义不是很大,甚至说没多大作用,因为所有的用户的盐都是一样的,相当于摆设:中看不中用(个人理解,如果有误,还请指正)。在下面举个例子:

//根据UUID的特性,UUID一般是不会重复的,因此可以用UUID作为盐,如果是用于对密码加密,建议把盐放入到数据库中
String salt= UUID.randomUUID().toString().replaceAll("-","");
//进行了MD5加密, 数据为password,盐salt=UUID.randomUUID.toString.replaceAll("-",""),散列次数: 1024
Md5Hash hash=new Md5Hash(password,salt,1024);

通过以上步骤我们就进行了加密,那么如何进行得到加密的密码(数据)呢?其实也就一步:

//简单的示例,输出密码
System.out.println(hash.toHex());
MD5加密注册:

MD5进行加密,那么如何注册呢?

在这里如上文所说,我们需要将加密后的密码放入到数据库中,同时也要把盐salt也放入到数据库中 (你不想登上除外),即我们可以直接进行相应的加密,

public ResponseData reg( String username, String password) {

    User user = new User();
    //MD5加密 获取器值
    String salt= UUID.randomUUID().toString().replaceAll("-","");
    Md5Hash hash=new Md5Hash(password,salt,1024);
    user.setAccount(username);
    user.setPassword(hash.toHex());
    user.setSalt(salt);
    //在此处将数据添加到数据库中
    int count=userDao.insertUser(user);
    //判断数据库是否添加成功 
    if (count > 0) {
        return ResponseData.success("注册成功");
    }
//ResponseData是一个结果集
    return ResponseData.fail("注册失败,请联系管理员");
}
MD5 登录:

MD5登录其实就比较简单了,因为shiro框架提供了响应的方法,因此你的登录就十分的简单

我们需要在自己的HashedCredentialsMatcher类中指出我们采用的算法是MD5,散列次数是1024 即可,在登陆的时候将你的密码、盐提供给shiro框架,就能用shiro框架的方法进行验证登录:

@Bean("hashedCredentialsMatcher")
public HashedCredentialsMatcher hashedCredentialsMatcher(){
    HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
    //指定加密方式
    credentialsMatcher.setHashAlgorithmName("MD5");
    //加密次数
    credentialsMatcher.setHashIterations(1024);
    return credentialsMatcher;
}

登录的操作

public ResponseData login(HttpServletRequest request, String username, String password) {
    //在此处获得了账号密码(均为正确)
    Subject subject= SecurityUtils.getSubject();
    //生成新的token
    UsernamePasswordToken token=new UsernamePasswordToken(username,password);
    //为数据保存到session中做准备
    HttpSession session=request.getSession(true);
    try {
        //验证token
        subject.login(token);
        //token验证成功
        if (subject.isAuthenticated()) {
            //查找用户直接导入
            User user=queryByAccount(username);
            session.setAttribute("User",user);
            return ResponseData.success("登陆成功");
        }
        return ResponseData.fail("验证失败,请联系管理员");
    }catch (UnknownAccountException e) {//这个异常的抛出标识账号不存在,这个不需要我门自己抛出
        return ResponseData.fail("账户不存在");
    }catch (IncorrectCredentialsException e){//该异常的出现表示密码错误 
        return ResponseData.fail("账号或密码错误");
    }
}

修改密码:

其实修改密码就是注册与登录的结合体,你需要先验证旧密码是否正确,正确后就将新密码进行MD5加密,将新密码和新的盐放进去

小结:

MD5加密于shiro进行结合,能够让让你的项目更加安全,shiro学习成本不是很高,但是自己目前学的不是很多,有待提升,如果有错,希望斧正~谢谢❀

标签:ResponseData,加密,密码,小白学,return,shiro,MD5
来源: https://blog.csdn.net/m0_53341445/article/details/119273522

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有