一.说明

1.分析

通过MD5+salt+hash散列进行用户登录查询。

重点:(1)加密存储到数据库(2)验证登录用户信息和数据库信息是否一致

2.目录结构

二.范例

1.调用类

(1)代码块

package com.fengmo;
import com.relam.CustomerMD5;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.subject.Subject;
/*** 测试:使用MD5+salt+hash散列的业务逻辑和使用*/
public class TestCustomerMD5 {public static void main(String[] args) {//1.创建安全管理器DefaultSecurityManager securityManager = new DefaultSecurityManager();//2.1创建realmCustomerMD5 customerMD5 = new CustomerMD5();//2.2创建hash凭证管理器HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();//2.3设置加密的算法是MD5hashedCredentialsMatcher.setHashAlgorithmName("MD5");//2.4设置散列次数hashedCredentialsMatcher.setHashIterations(1024);//2.4设置realm为hash凭证管理器【以上为管理器的配置】customerMD5.setCredentialsMatcher(hashedCredentialsMatcher);//2.5注入realmsecurityManager.setRealm(customerMD5);//3.将安全管理器注入到安全工具SecurityUtils.setSecurityManager(securityManager);//4.通过subject获取容器对象Subject subject = SecurityUtils.getSubject();//5.创建令牌UsernamePasswordToken token = new UsernamePasswordToken("xiaochen", "123");//6.认证try{subject.login(token);System.out.println("没有异常,则登录成功");}catch (UnknownAccountException e){     //用户名不存在e.printStackTrace();System.out.println("用户名错误");}catch (IncorrectCredentialsException e2){  //密码错误e2.printStackTrace();System.out.println("密码错误");}}
}

(2)范例

2.md5加密类【用于注册用户时存储密码进行加密】

(1)代码块

package com.md5;
import org.apache.shiro.crypto.hash.Md5Hash;
/*MD5算法:1.作用:一般用于加密或者签名(校验和)2.特点:MD5算法不可逆,如何内容相同无论执行多少次md5生成结果始终是一致3.生成结果:始终是一个16进制32位长度字符串4.加密时选择MD5+Salt(盐)*/
public class MD5Demo {public static void main(String[] args) {//1.创建MD5算法Md5Hash md5Hash = new Md5Hash();//1.2使用byte【】数组形式的参数加密md5Hash.setBytes("123".getBytes());//1.3查看加密的结果String hex = md5Hash.toHex();   //返回加密后的字符串System.out.println("这是错误的密码算法"+hex);//以上的错误加密写法//正确写法一【不加salt(盐)的算法,不推荐】//2.1.创建MD5算法Md5Hash md5Hash2 = new Md5Hash("123");  //构造参数存储需要加密的明文字符串//2.2获取加密后的结果//存储数据库时就用md5Hash2.toHex()System.out.println("这是正确的密码算法(不加salt)"+md5Hash2.toHex());//正确写法二【加salt(盐)的算法,推荐】//3.1使用md5+salt处理Md5Hash md5Hash3 = new Md5Hash("123","X0*7ps"); //salt可以随意写//3.2获取加密后的结果//存储数据库时就用md5Hash2.toHex()System.out.println("这是正确的密码算法(加salt)"+md5Hash3.toHex());//正确写法三 MD5 + salt + hash散列//4.1使用md5+salt+hash散列Md5Hash md5Hash4 = new Md5Hash("123","X0*7ps",1024);//4.2获取加密后的结果//存储数据库时就用md5Hash2.toHex()System.out.println("这是正确的密码算法(加salt加hash散列)"+md5Hash4.toHex());}
}

(2)范例

3.认证类【用于登录用户验证用户信息】

(1)代码块

package com.relam;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
/*** 自定义realm实现 + MD5 + salt + hash散列* 将认证/获取数据的来源转为数据库的实现*/
public class CustomerMD5 extends AuthorizingRealm {//这是授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {return null;}//这是认证@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//获取身份信息【获取用户名】String principal = (String)token.getPrincipal();//根据用户名查询数据库if("xiaochen".equals(principal)){   //xiaochen以后是从数据库进行获取//明文存储//return new SimpleAuthenticationInfo(principal,"123",this.getName());//md5算法存储//return new SimpleAuthenticationInfo(principal,"202cb962ac59075b964b07152d234b70",this.getName());//参数一是身份信息,参数二是数据库获取的密码【MD5+salt】,参数三是salt,参数四是realm的名称//return new SimpleAuthenticationInfo(principal, "8a83592a02263bfe6752b2b5b03a4799", ByteSource.Util.bytes("X0*7ps"), this.getName());//参数一是身份信息,参数二是数据库获取的密码【MD5+salt+散列】,参数三是salt,参数四是realm的名称return new SimpleAuthenticationInfo(principal,"e4f9bf3e0c58f045e62c23c533fcf633", ByteSource.Util.bytes("X0*7ps"),this.getName());}return null;}
}

(2)范例

三.源码

shiro2.rar

使用md5+salt+hash散列查询相关推荐

  1. shiro的通过md5+salt+hash散列进行注册操作

    一 . 注册流程 1.1 描述 通过http://localhost:8888/shiro/user/register访问 进行注册,调用register方法:通过md5+salt+hash(1024 ...

  2. MD5(单向散列算法)原理分析

    注:本文章转载于网络. MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. ...

  3. 安全系列之——主流 Hash 散列算法介绍和使用

    这里填写标题 1. 安全系列之--主流 Hash 散列算法介绍和使用 1.1. Hash 散列算法介绍 1.2. Hash 散列算法的特征 1.3. 散列算法的使用 1.3.1. 文件传输 1.3.2 ...

  4. 安全系列之——主流Hash散列算法介绍和使用

    其他文章: 安全系列之--手写JAVA加密.解密 安全系列之--数据传输的完整性.私密性.源认证.不可否认性 安全系列之--主流Hash散列算法介绍和使用 安全系列之--RSA的公钥私钥有多少人能分的 ...

  5. Redis 05_List列表 数组 Hash散列

    First: 基于Linked List实现 元素是字符串类型 列表头尾增删快,中间增删慢,增删元素是常态 元素可以重复出现 最多包含2^32-1元素 列表的索引 从左至右,从0开始 从右至左,从-1 ...

  6. Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区

    Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测).链地址法.再哈希.建立公共溢出区 参考文章: (1)Java解决Hash(散列)冲突的四种方法--开放地址法 ...

  7. 密码学之Hash散列算法

    前言 在第一篇文章中已经有介绍区块链技术概念,我们知道区块链主要是由共识算法机制.p2p网络.密码学这几个核心技术组成,前面几篇文章讲了共识算法,p2p网络,这次我们谈一下密码学,密码学是区块链系统的 ...

  8. Hash(散列)建表及查找

    散列方法 不用比较就能直接计算出记录的存储地址,从而找到所要的结点 Hash表 1).定义 根据设定的散列函数和相应解决冲突的方法为一组结点建立的一张表,表中的结点的存储位置依赖于设定的散列函数和处理 ...

  9. Hash(散列)冲突解决之线性探测再散列和二次探测再散列

    线性探测再散列 H(key) = key %13,key 为关键字,采用开放地址法中的线性探测再散列解决冲突,依次输入11 个关键字,16,74,60,43,54,90,46,31,29,88,77, ...

最新文章

  1. autoconfig oracle,ORACLE EBS 执行autoconfig time out
  2. @transaction 提交事务_分布式事务 TCC-Transaction 源码分析——TCC 实现
  3. golang 变量定义和初始化
  4. python序列类型-python序列类型包括哪三种
  5. JSP自定义标签开发与打包
  6. youtube根据channelId抓取栏目
  7. wxWidgets:wxList< T >类模板的用法
  8. OSPF 多进程实验(1)
  9. 为什么Python 4.0不会像Python 3.0
  10. v-if和v-for一起用踩过的坑
  11. MATLAB脚本显示滤波器系数
  12. 使用Visual C#制作可伸缩个性化窗体
  13. pyplot设置刻度字体大小以及标签字体大小
  14. mysql8.0创建用户权限,详解mysql8.0创建用户授予权限报错解决方法
  15. Windows下编译CMake源码(Opencv源码编译)
  16. Deep Learning论文翻译(Nature Deep Review)
  17. 为你的树莓派安装xbox手柄驱动~
  18. 更改cadence617 schematic和visualizationAnalysis界面背景颜色
  19. 深圳商报 | 跨境电商大会聚焦跨境收款难题
  20. c++生成so调用LOGI

热门文章

  1. 2022年lazada跨境店 新,马,泰,菲等4个国家正式开放食品类目招商
  2. 计算机怎样将多行文字转换成表格,怎么把表格里的字变成两行
  3. 前端隐秘角落 - web安全的演变历程
  4. windows网络适配器 黄色下三角
  5. python字母表顺序函数_python获取字母在字母表对应位置的几种方法及性能对比较...
  6. Gym - 101986F Pizza Delivery (最短路必经路径)
  7. APS系统六大要素是什么?企业导入APS(高级生产计划与排程)有哪些好处?
  8. 2018年医疗大数据产业的发展及解决方案
  9. 什么是微分?导数和微分的区别是什么?微分和积分的联系?
  10. 商标注册流程和周期是什么