MD5加密详解

MD5加密详解MD5加密详解加密过程:密码:123456(明文形式)—–>加密后49ba59abbe56e0571.密码在请求提交后到达控制器2.到达控制后通过加密规则,转换成密文3.在经过DAO查询与数据库中已经存在的密文密码比对是否一直,一致,则放行。用户注册密码时是加密存储的用户修改密码时,也需要进行加密存储加密规则:加密规则可以自定义,在项目中通常使用BASE64和MD5,本文使用的加密规则就是MD5,BASE64:可反编码的编码方式​

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

MD5加密详解

加密过程:

密码:123456 (明文形式)—–>加密后 49ba59abbe56e057

1.密码在请求提交后到达控制器

2.到达控制后通过加密规则,转换成密文

3.在经过DAO查询与数据库中已经存在的密文密码比对是否一直,一致,则放行。

  • 用户注册密码时是加密存储的

  • 用户修改密码时,也需要进行加密存储

加密规则:


  • 加密规则可以自定义,在项目中通常使用BASE64和MD5,本文使用的加密规则就是MD5,

  • BASE64: 可反编码的编码方式

    ​ 明文—密文

    ​ 密文–明文

  • MD5:不可逆的编码方式 (非对称)

    明文—-密文

  • 如果数据库用户的密码储存的密文,Shiro如何完成验证?

  • 使用Shiro提供的加密功能,对输入的密码进行加密后在进行确认。

    Shiro使用加密认证

    配置matcher

    @Configuration
    public class ShiroConfig { 
         
    
        //...
        @Bean
        public HashedCredentialsMatcher getHashedCredentialsMatcher(){ 
         
            HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
            //matcher就是用来指定加密规则
            //加密方式
            matcher.setHashAlgorithmName("md5");
            //hash次数
            matcher.setHashIterations(1);	//此处的循环次数要与用户注册是密码加密次数一致
            return matcher;
        }
    
        //自定义Realm
        @Bean
        public MyRealm getMyRealm( HashedCredentialsMatcher matcher ){ 
         
            MyRealm myRealm = new MyRealm();
            myRealm.setCredentialsMatcher(matcher);
            return myRealm;
        }
    
    	//...
    }
    

    用户密码加密处理

    • UserComtroller

      @Controller
      @RequestMapping("user")
      public class UserController { 
             
      
          @Resource
          private UserServiceImpl userService;
      
      
      
          @RequestMapping("/regist")
          public String regist(String userName,String userPwd) { 
             
              System.out.println("------注册");
      
              //注册的时候要对密码进行加密存储
              Md5Hash md5Hash = new Md5Hash(userPwd);
              System.out.println("--->>>"+ md5Hash.toHex());
      
              //加盐加密
              int num = new Random().nextInt(90000)+10000;   //10000—99999
              String salt = num+"";
              Md5Hash md5Hash2 = new Md5Hash(userPwd,salt);
              System.out.println("--->>>"+md5Hash2);
      
              //加盐加密+多次hash
              Md5Hash md5Hash3 = new Md5Hash(userPwd,salt,3);
              System.out.println("--->>>"+md5Hash3);
      
              //SimpleHash hash = new SimpleHash("md5",userPwd,num,3);
      		
              //将用户信息保存到数据库时,保存加密后的密码,如果生成的随机盐,盐也要保存
              
              return "login";
          }
      
      }
      

加盐处理

  • 在自定义Realm中:

     /** * 获取认证的安全数据(从数据库查询的用户的正确数据) */
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { 
         
            //参数authenticationToken就是传递的 subject.login(token)
            // 从token中获取用户名
            UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
            String username = token.getUsername();
            //根据用户名,从数据库查询当前用户的安全数据
            User user = userDAO.queryUserByUsername(username);
    
    // AuthenticationInfo info = new SimpleAuthenticationInfo(
    // username, //当前用户用户名
    // user.getUserPwd(), //从数据库查询出来的安全密码
    // getName());
    
            //如果数据库中用户的密码是加了盐的
            AuthenticationInfo info = new SimpleAuthenticationInfo(
                    username,           //当前用户用户名
                    user.getUserPwd(),   //从数据库查询出来的安全密码
                    ByteSource.Util.bytes(user.getPwdSalt()),
                    getName());
    
            return info;
        }
    }
    
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157723.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • BeanUtils.populate 源码分析

    BeanUtils.populate 源码分析BeanUtilsBean propertyUtilsBean  MethodgetWriteMethod(Classclazz,PropertyDescriptordescriptor){    return(MethodUtils.getAccessibleMethod(clazz,descriptor.getWriteMethod())); …

  • hadoop集群启动步骤

    hadoop集群启动步骤hadoop集群启动步骤

  • Windows 10配置远程开机[通俗易懂]

    Windows 10配置远程开机[通俗易懂]简介最近有个需求,在外边或者是上班的时候想从家里的电脑拿点资料,虽然家里的路由器有公网IP地址,但是电脑总不能一直开着吧,然后就想到可以远程通过网卡唤醒电脑。前提条件拥有一个公网IP(一般可以找运营商申请),如果拥有的公网IP是动态的话,需要绑定DDNS域名,DDNS域名可以自行注册。 电脑主板支持网络唤醒功能。配置方法主板开启网络唤醒功能,如图:设置网络适配器支持唤醒…

  • Eclipse程序员要掌握的常用快捷键建议收藏

    判断一个人的编程水平,就看他用键盘多,还是鼠标多。用键盘一是为了输入代码(当然了,也包括注释),再有就是熟练使用快捷键。所以在网上找了一下,自己也总结了些用得比较多的,和大家一起分享一下。Ctrl+K

    2021年12月20日
  • 关于widthStep造成的问题

    关于widthStep造成的问题最近遇到一个很奇怪的问题,一直没有解决,就是在A图像中设置一个ROI,将其clone给B,然后对B进行二值化,输入为B,输出为C,这时二值化完后的图像C跟ROI区域的图像区域不同。通过查看发现罪魁祸首是widthStep变了。无意中解决了这个问题,做法如下:方法1:就是在A图像中设置一个ROI,将其clone给B,新建一个C,大小、位数和通道数同B,将Bclone给C,然后对C进行

  • 日期格式化java_JAVA格式化时间日期

    importjava.util.Date;importjava.text.DateFormat;/***格式化时间类*DateFormat.FULL=0*DateFormat.DEFAULT=2*DateFormat.LONG=1*DateFormat.MEDIUM=2*DateFormat.SHORT=3*@authorMichael*@versi…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号