在数据表中存的密码不应该是123456,而应该是123456加密之后的字符串,而且还要求这个加密算法是不可逆的,即由加密后的字符串不能反推回来原来的密码,如果能反推回来那这个加密是没有意义的。著名的加密算法,比如 MD5,SHA1。下面就来介绍如何用shiro进行MD5加密并验证

1.在注册的时候将前端传过来的密码入数据库之前进行加密

 public void encryptPassword(User user) {
String salt = new SecureRandomNumberGenerator().nextBytes().toHex();
user.setSalt(salt); String newPassword = new SimpleHash(
algorithmName,
user.getPassword(),
user.getSalt(),
hashIterations).toHex(); user.setPassword(newPassword);
}

  

2.在spring容器中自定义realm的配置加入HashedCredentialsMatcher,这样前端输入的密码进入realm就会自动进行加密了,此外还可以配置了加密次数等。

<bean id="myShiroRealm" class="com.wang.realm.MyShiroReaml">
<!-- businessManager 用来实现用户名密码的查询 -->
<property name="userService" ref="userService" />
<property name="permissionService" ref="permissionService" />
<!-- 如果不加入密码匹配的操作,密码就不会存在 -->
<!-- 加入了密码匹配器之后,就会默认将前台传递过来的密码自动MD5加密 -->
<property name="credentialsMatcher">
<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!-- 加密的方式 -->
<constructor-arg index="0" type="java.lang.String" value="MD5" />
<!-- 加密的次数,默认是1次 -->
<property name="hashIterations" value="2"/>
</bean>
</property>
</bean>

 3.这部分就是realm的验证部分了接收前端的参数,取出数据库中的对象,然后根据密码,盐值等进行解密,匹配等等,这部分shiro已经帮我们做好了。

 // 认证方法
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //验证账号密码
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
User user = userService.findUserByName(token.getUsername());
if(user==null){
throw new UnknownAccountException();
}
if(Boolean.TRUE.equals(user.getLocked())) {
throw new LockedAccountException(); //帐号锁定
} ByteSource credentialsSalt = ByteSource.Util.bytes(user.getSalt());//这里的参数要给个唯一的; //最后的比对需要交给安全管理器
//三个参数进行初步的简单认证信息对象的包装
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
user.getUsername(), //用户名
user.getPassword(), //密码
credentialsSalt,
getName() //realm name
); return authenticationInfo;
}

  

shiro盐值加密并验证的更多相关文章

  1. shiro密码的比对,密码的MD5加密,MD5盐值加密,多个Relme

    有具体问题的可以参考之前的关于shiro的博文,关于shiro的博文均是一次工程的内容 密码的比对   通过AuthenticatingRealm的CredentialsMatcher方法 密码的加密 ...

  2. SpringBoot整合shiro-MD5盐值加密

    为什么要进行密码加密? 在我们的日常生活中,许多人有着在不同网站上使用相同密码的坏习惯(包括我也是qaq),假如应用程序或服务器出现漏洞,数据被窃取,用户的明文密码直接被暴露给黑客.显然后果将不堪设想 ...

  3. c# MD5及盐值加密

    using System;using System.Collections.Generic;using System.Linq;using System.Security.Cryptography;u ...

  4. c# MD5盐值加密

    using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptograph ...

  5. Spring Security中的MD5盐值加密

    在 spring Security 文档中有这么一句话: "盐值的原理非常简单,就是先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算,这样一来,就算密码是一个很常见的字 ...

  6. MD5盐值加密

    加密思路 思路解析:(数据解析过程基于16进制来处理的,加密后为16进制字符串) 加密阶段: 对一个字符串进行MD5加密,我们需要使用到MessageDigest(消息摘要对象),需要一个盐值(sal ...

  7. shiro 密码的MD5盐值加密

  8. Java和JS MD5加密-附盐值加密demo

    JAVA和JS的MD5加密 经过测试:字母和数据好使,中文不好使. 源码如下: ** * 类MD5Util.java的实现描述: * */public class MD5Util { // 获得MD5 ...

  9. Shiro自定义realm实现密码验证及登录、密码加密注册、修改密码的验证

    一:先从登录开始,直接看代码 @RequestMapping(value="dologin",method = {RequestMethod.GET, RequestMethod. ...

随机推荐

  1. 一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式

    前言 有时候我们需要在应用启动时执行一些代码片段,这些片段可能是仅仅是为了记录 log,也可能是在启动时检查与安装证书 ,诸如上述业务要求我们可能会经常碰到 Spring Boot 提供了至少 5 种 ...

  2. 【题解】GREWords(AC自动机)

    [题解]GREWords(AC自动机) SP9941 GRE - GRE Words 题目大意: 给定一个由字符串构成的序列,不同位置的字符串有自己权值.现在让你选出一个子序列,使得在这个子序列中,前 ...

  3. mysql主从同步--读写分离。

    1.mysql 安装参考 https://www.cnblogs.com/ttzzyy/p/9063737.html 2. 主mysql,从mysql 指定配置文件启动 mysqld --defaul ...

  4. Jenkins+ant+jmeter环境搭建

    下载的工具版本: apache-jmeter-3.0 apache-ant-1.8.4 jenkins-2.46.3 之前用jmeter写了测试接口的脚本,运行及返回结果都正常,所以需要做的就是工具的 ...

  5. Java事务失效

    问题复现,用伪代码复现问题! 事务配置文件 <tx:advice id="txAdvice" transaction-manager="transactionMan ...

  6. react项目使用antd

    在开始实践之前要确保搭建React单页面开发环境,如果还没有搭建好开发环境的朋友请移步到如何搭建React单页面开发环境. 首先在命令行模式下创建一个React项目(项目名使用小写字母命名):(win ...

  7. K8S集群搭建

    K8S集群搭建 摘要 是借鉴网上的几篇文章加上自己的理解整理得到的结果,去掉了一些文章中比较冗余的组件和操作,力争做到部署简单化. K8S组件说明 Kubernetes包含两种节点角色:master节 ...

  8. docker操作

    Redis docker run -itd --name myredis -v /dockerdata/redis/config/redis.conf:/etc/redis/redis.conf  - ...

  9. 【转】DB2数据库编目的概念以及对其的正确解析

    此文章主要向大家描述的是DB2数据库编目的概念以及对DB2数据库编目的概念的正确理解,在DB2中编目(catalog)这个单词看似很难理解,我自己当初在学习DB2数据库的时候也常常被这个编目搞的很不明 ...

  10. MapInfo常见数据格式

    在MapInfo 中所指的表是单纯的数据表或是图形与数据的结合.一个典型的MapInfo表将主要由*.tab.*.dat.*.wks.*.dbf.*.xls.*.map.*.id.*.ind文件格式组 ...