文章目录

  • Shiro凭证匹配器(密码匹配器)
    • 1. 普通加密
    • Shiro普通加密(md5)实现
      • 1.1 编写MD5加密工具类MD5Utils
      • 1.2 测试MD5算法
      • 1.3 在applicationContext-shiro.xml添加凭证匹配器(使用默认匹配器)
    • 2. 加盐加密
      • 2.1 测试加盐加密(添加一个特殊的字符串)
      • 2.2 配置自定义的密码匹配器
      • 2.3 在applicationContext-shiro.xml添加自定义的凭证匹配器(自定义密码匹配)
      • 2.4 修改业务,当添加一个用户的时候进行密码加盐加密保存
      • 2.5 shiro退出登录
      • 2.5 测试登录,登录成功(数据库密码已经加盐加密)

Shiro凭证匹配器(密码匹配器)

1. 普通加密

加密:将明文加密成密文保存,常见的用户密码保存在数据库中是需要加密码保存的(防止出现密码泄露造成用户的损失)。
在实际项目中,密码基本上都是密文保存的(加密后保存)

常见加密算法:
MD5,SHA-512,SHA-256等等(或者叠加使用md5(SHA512))

常见加密解密算法地址:
http://www.ttmd5.com/list.php

Shiro普通加密(md5)实现

实现步骤:
1)对数据库密码进行md5加密
使用mysql的md5函数对密码进行加密,然后直接修改数据库的用户密码测试登录。
2) 在applicationContext-shiro.xml,添加加密认证配置

1.1 编写MD5加密工具类MD5Utils

/**MD5加密工具类* 进行数据加密* 本项目只用于测试,用shiro自带的hash.Md5Hash算法加密*/
public class MD5Utils {//参1 传入的明文public static String stringToMD5(String plainText) {byte[] secretBytes = null;try {//对明文的字节进行摘要加密secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有找到MD5算法");}//radix参数 16位或者32位(加密之后的位数)String md5code = new BigInteger(1, secretBytes).toString(16);//补0操作,一个字节转两位的16进制for (int i = 0; i < 32 - md5code.length(); i++) {md5code = "0" + md5code;}return md5code;}
}

1.2 测试MD5算法

/*** 测试MD5加密工具类* 测试shiro自带的hash.Md5Hash加密*/
public class MD5UtilsTest {//测试MD5工具类加密@Testpublic void stringToMD5() {//对123456进行MD5加密String result = MD5Utils.stringToMD5("123456");//md5(123456)= e10adc3949ba59abbe56e057f20f883eSystem.out.println(result);}//测试shiro自带的hash.Md5Hash算法加密,(shiro也集成常用的加密的算法md5,sha-1)@Testpublic void test02() {// 对123456加密Md5Hash md5Hash = new Md5Hash("123456");System.out.println(md5Hash.toString()); //e10adc3949ba59abbe56e057f20f883e}
}

1.3 在applicationContext-shiro.xml添加凭证匹配器(使用默认匹配器)

    <!-- 配置一个密码的匹配器 --><!--  123456 是用户提交过来的密码明文, 密码的匹配器,得到密文,与数据库的密码 --><!--创建凭证匹配器--><bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"><!--指定加密算法--><property name="hashAlgorithmName" value="md5"/></bean><!-- 3.创建Realm(类似dao),在AuthRealm类上就不需要加@Component注解了 --><bean id="authRealm" class="com.xgf.web.shiro.AuthRealm"><!-- 使用自定义匹配器(密码) --><property name="credentialsMatcher" ref="credentialsMatcher"/></bean>

2. 加盐加密

1)为什么要加盐(加盐实现加密的意义)

如果只是单纯使用md5或sha1进行加密,容易被人利用"彩虹表"撞库来破解密码,导致密码不安全!这时可以进行加盐加密来解决。
破解方法:将很多的字符串进行调用加密算法,生成对应的很多的密文,然后根据密文倒过来查表(这个表非常的大比如100G,时间虽然久一点,但是能够破解),得出明文(撞库更具密文查找明文)。

2)如何加盐加密

添加一个特殊字符串,别人推导明文的时候,还需要去推导那个特殊的字符串,增加推导任务,造成算率不够导致推导不出来等。

3)shiro加盐加密步骤

1、编写代码对密码加盐加密
2、编写自定义凭证匹配器
3、在applicationContext-shiro.xml,添加自定义凭证匹配器

2.1 测试加盐加密(添加一个特殊的字符串)

MD5UtilsTest

//测试加盐加密(添加一个特殊字符串)@Testpublic void test03() {//参1:传入明文  参2:加盐(特殊字符串)Md5Hash md5Hash = new Md5Hash("123456","strive_day@163.com");System.out.println(md5Hash.toString());//2f660a3a69e023b9033c83ef3d418c9b}//测试加另一个盐(另一个字符串)@Testpublic void test04() {Md5Hash md5Hash = new Md5Hash("123456","study@export.com");//参1 传入明文  参2盐System.out.println(md5Hash.toString());//4154661a85ae8bafac91433e7003f4a2和上面的密文不一样,因为特殊字符串盐不一样}

2.2 配置自定义的密码匹配器

CustomCredentialsMatcher

/**创建自己的密码匹配器 - 通过加盐加密对用户输入的明文进行加密然后和数据库中存储的密文比较* 必须指定父类SimpleCredentialsMatcher*/
public class CustomCredentialsMatcher extends SimpleCredentialsMatcher {private Logger l = LoggerFactory.getLogger(this.getClass());//将密码加密成密文,但需要使用账号(这里账号是邮箱)作盐//subject.login(token) 获取页面提交的密码 (比如123456)  通过加盐加密转为 -> 密文1//info  调relam 查询数据库中的密码(数据库中的密码存储就是加密存储的) -> 密文2//通过比较密文1(用户输入的值)和密文2(数据库中的值),来判断用户输入是否正确@Overridepublic boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {//token获取账号密码UsernamePasswordToken t = (UsernamePasswordToken) token;String email = t.getUsername(); //获取用户名(邮箱)//密码是char[] '1','2','3'  => "123"  new String(char[])String pwd1 = new String(t.getPassword());  //密码获取的是字符数组,转换为字符串l.info("doCredentialsMatch 用户输入的密码明文pwd1 = "+pwd1);//进行加盐加密,得到用户输入的密码明文加密后的密文Md5Hash md5Hash = new Md5Hash(pwd1, email);//参1 传入明文  参2盐pwd1 = md5Hash.toString();  //转换为字符串l.info("doCredentialsMatch 用户输入的密码加盐加密后pwd1 "+pwd1);//读取数据库的密码,数据库存储的就是密文String pwd2 = (String) info.getCredentials();l.info("doCredentialsMatch 数据库的密码密文pwd2 = "+pwd2);if (pwd1.equals(pwd2)) {return true;//密码正确(两个密文比较)} else {return false;//密码不正确}}
}

2.3 在applicationContext-shiro.xml添加自定义的凭证匹配器(自定义密码匹配)

    <!--使用自己定义的匹配器--><bean id="credentialsMatcher2" class="com.xgf.web.utils.CustomCredentialsMatcher"></bean><!-- 3.创建Realm(类似dao),在AuthRealm类上就不需要加@Component注解了 --><bean id="authRealm" class="com.xgf.web.shiro.AuthRealm"><!-- 使用自定义匹配器(密码) --><property name="credentialsMatcher" ref="credentialsMatcher2"/></bean>

2.4 修改业务,当添加一个用户的时候进行密码加盐加密保存

UserServiceImpl

    @Overridepublic void saveUser(User user) {String uuid= UUID.randomUUID().toString();user.setUserId(uuid);//原来保存用户使用的密码是明文,现在需要对它进行加密if(user.getPassword()!=null){//不能对空字符串进行加密//使用shiro自带的加密Md5Hash//参1:密码明文  参2:盐(按照邮箱设置盐)Md5Hash md5Hash = new Md5Hash(user.getPassword(),user.getEmail());user.setPassword(md5Hash.toString());}l.info("save user = " + user);iUserDao.save(user);}

2.5 shiro退出登录

UserController

    //使用shiro退出登录(不再使用前面的普通登录退出了)@RequestMapping(path = "/loginOut-shiro", method = {RequestMethod.GET, RequestMethod.POST})public String loginOutShiro(){//删除session中的用户信息Subject subject = SecurityUtils.getSubject();//shiro退出登录subject.logout();l.info("loginOut-shiro注销用户");return "redirect:/login-shiro.jsp";}

header.jsp的注销方式改为shiro注销

<%-- 非加密方式注销 --%>
<%--<a href="${path}/system/user/loginOut" class="btn btn-default btn-flat">注销</a>--%>
<%--使用shiro退出 subject.logout(); --%>
<a href="${path}/system/user/loginOut-shiro" class="btn btn-default btn-flat">注销</a>

2.5 测试登录,登录成功(数据库密码已经加盐加密)


【SaaS - Export项目】23 - Shiro加密实现登录注销,MD5加密算法,加盐加密,shiro凭证匹配器,实现增加用户密码密文存储数据库,登录时通过加盐加密对密文进行比较相关推荐

  1. 用户密码在后台数据库中加密存储方式

    常见的用户密码在后台数据库中加密存储方式 如何安全的存储用户密码 常见登录密码加密方式 JavaScript逆向实战:admin加密成WaQ7xbhc9TefbwK是什么加密算法?逆向思维考验.详细流 ...

  2. 西门子SMART LINE触摸屏用户密码失效,无法登录的解决办法

    西门子SMART LINE触摸屏用户密码失效,无法登录的解决办法 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 有小伙伴反映,在使用SMART触摸 ...

  3. java自带的md5加密_JDK自带MD5加密算法

    [     在各种应用系统的开发中,经常需要存储用户信息,很多地方都要存储用户密码,而将用户密码直接存储在服务器上显然是不安全的,本文简要介绍工作中常用的 MD5加密算 其实jdk就自带了md5加密算 ...

  4. 常见的用户密码在后台数据库中加密存储方式

    转载自:https://blog.csdn.net/ctrip_tech/article/details/80125741 一.用户密码加密 用户密码保存到数据库时,常见的加密方式有哪些,我们该采用什 ...

  5. python md5加密解密_Python使用MD5加密算法对字符串进行加密操作示例

    本文实例讲述了Python使用MD5加密算法对字符串进行加密操作.分享给大家供大家参考,具体如下: # encoding: utf-8 from __future__ import division ...

  6. 【SaaS - Export项目】18 - 用户登录、注销登录

    文章目录 1. export_system_service子工程编写测试类测试登录功能 2. export_system_service子工程的service接口和实现类 3. export_dao子 ...

  7. Linux——Ubuntu忘记用户密码的解决及登录root

    [系统版本]:Ubuntu 12.04 [忘记密码的解决方法]: 1.重启系统,长按shift键进入grub菜单: 2.选择recovery mode恢复模式: 3.在recovery menu中选择 ...

  8. oracle密文怎么弄成明文,明文编码随机化加密方案

    随着密码技术的发展, 可证明安全概念已被广泛认可.在随机谕言机(random oracle, 简称RO)模型[或者标准模型下具有自适应性选择密文攻击不可区分安全(indistinguishable s ...

  9. linux mysql 修改密码之后还是不能登录_怎样在Linux下搭建接口自动化测试平台?...

    前言 之前在学习HttpRunner时,我们都是把用例写在 YAML/JSON 中进行维护,使用起来也很方便.其实,现在有不少大佬都喜欢开发自动化测试平台,比如我们今天要搭建的HttpRunnerMa ...

  10. Edusoho修改注册的用户密码加密机制规则

    一.简介 1.修改生成$salt的机制规则. 2.修改生成$password的机制规则. 二.edusoho的默认用户密码加密机制规则 1.系统默认生成$salt的方式: edusoho\src\Bi ...

最新文章

  1. Nutch 二次开发之parse正文内容
  2. Nature Methods:快速准确的微生物来源追溯工具FEAST
  3. 教你使用stm32接收串口的一帧数据!
  4. 一个时间日期转换格式的小功能(Oracle)
  5. 十秒解决开发环境跨域问题——取消浏览器同源策略
  6. 一个C#读写Dxf的类库DXFLibrary
  7. 端口停止使用_我停止使用
  8. java 异步socket_java Socket读写异步分离
  9. c++如何让字符串重复输出_Python基础三(数据类型之数字和字符串)
  10. signature=e77a95aa96da4f165d75bdbdf33ba079,来用百度密语吧!!!
  11. rufus设置linux分区,rufus使用教程【处理方案】
  12. 密码键盘介绍二:主密钥和工作密钥的导入
  13. 〖小狼毫〗小狼毫使用心得分享
  14. 新一代至强CPU加速GBase 8a MPP,GBase GCDW云数据仓库助力行业迎接数字化转型新挑战
  15. 【机器学习】(十)核支持向量机SVM:make_blobs方法,hstack() 函数
  16. 联想台式电脑一键恢复后桌面没有计算机了,联想笔记本一键恢复功能使用教程...
  17. 为什么粘贴是crtl+v
  18. 计算机网络(七):网络安全
  19. SSE(Server-sent Events)实现Web消息推送(SpringBoot)
  20. 巴比特 | 元宇宙每日必读:未成年人打赏后要求退款,虚拟主播称自己是大冤种,怎么看待这个监管漏洞?...

热门文章

  1. 入门级CC(Smart3D)照片建模
  2. 考研高等数学张宇30讲笔记——第九讲一元函数积分学的几何应用
  3. 一文讲清楚ojdbc、Oracle和JDK之间的兼容性关系
  4. 计算机房设计规范2008,电子信息系统机房设计规范(GB50174-2008)(下)
  5. win10打开视频显示HEVC视频扩展
  6. excel甘特图制作项目进度管理表
  7. MySQL安装及可视化工具使用
  8. AhMyth远程控制手机实践
  9. 阿里云播放器Aliplayer-WEB走坑中
  10. JS实现将文件和base64的相互转换