Shiro密码加密 盐值加密
1.为什么要盐值加密
对于同一密码,同一加密算法会产生相同的hash值。这样,当用户进行身份验证时,对用户输入的明文密码应用相同的hash加密算法,得出一个hash值,然后使用该hash值和之前存储好的密文值进行对照,如果两个值相同,则密码认证成功,否则密码认证失败。出于更安全的考虑,即使两个用户输入的是相同的密码,也应该要保存为不同的密文,即使用户输入的是弱密码,也需要考虑进行增强,从而增加密码被攻破的难度。因此出现了加盐加密。
那么盐值加密是怎么加密的呢,用下面的图来解释:
加密过程(用户注册)
也就是说最终的密文是以下两个内容的函数
- 用户输入的密码明文
- 盐值
最后要将以下内容存入数据库:
- 用户的用户名
- 最终的密文
- 加密所用的盐值
校验过程(用户登录)
2.在Springboot项目中如何利用Shrio进行密码加密
1.在ShiroConfig中为自定义UserRealm对象添加密码匹配凭证管理器HashedCredentialsMatcher
部分代码如下:
//创建Realm 对象,需要用户自定义
@Bean(name = "UserRealm")
public UserRealm userRealm(@Qualifier("hashedCredentialsMatcher") HashedCredentialsMatcher matcher) {UserRealm userRealm = new UserRealm();userRealm.setCredentialsMatcher(matcher);return userRealm;
}/*** 密码匹配凭证管理器** @return*/
@Bean(name = "hashedCredentialsMatcher")
public HashedCredentialsMatcher hashedCredentialsMatcher() {HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();// 采用MD5方式加密hashedCredentialsMatcher.setHashAlgorithmName("MD5");// 设置加密次数hashedCredentialsMatcher.setHashIterations(1024);return hashedCredentialsMatcher;
}
2.修改UserRealm认证中AuthenticationInfo
/*** 认证** @param token* @return* @throws AuthenticationException*/@Overridepublic AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {/* System.out.println("执行了=》doGetAuthenticationInfo");*/UsernamePasswordToken usertoken = (UsernamePasswordToken) token;//连接真实的数据库 用户名:密码 数据库中取User user = userService.queryUserByname(usertoken.getUsername());// 获取盐值,即用户名ByteSource salt = ByteSource.Util.bytes(usertoken.getUsername());//没有当前用户//抛出一个异常 LoginController中的login方法if (user == null) {return null;}//密码验证:Shiro做//自动认证 第一个参数传递User// 最后一个参数为当前realm对象的名称,调用分类的getName()return new SimpleAuthenticationInfo(user, user.getPwd(), salt, getName());}
同样的是登录Controller和之前写法一样
//获得当前的用户Subject subject = SecurityUtils.getSubject();//封装用户的登录数据UsernamePasswordToken token = new UsernamePasswordToken(username, password);try { subject.login(token);//执行登录方法,如果没有异常就说明ok了return "redirect:/main.html";} catch (UnknownAccountException e) {model.addAttribute("msg", "用户名错误");return "index";} catch (IncorrectCredentialsException e) {model.addAttribute("msg", "密码错误");return "index";}
不过在注册界面我们就需要对密码进行盐值加密了,这里Shiro为我们提供了加密api
public String registerUser(@RequestBody User user) {// 将用户名作为盐值ByteSource salt = ByteSource.Util.bytes(user.getName());/** MD5加密:* 使用SimpleHash类对原始密码进行加密。* 第一个参数代表使用MD5方式加密* 第二个参数为原始密码* 第三个参数为盐值,即用户名* 第四个参数为加密次数* 最后用toHex()方法将加密后的密码转成String* */String newPs = new SimpleHash("MD5", user.getPwd(), salt, 1024).toHex();user.setPwd(newPs);user.setPerms(user.getPerms());userService.registerUser(user);return "register";}
需要注意的是,如果数据库中的密码不是加密后的会报错。
而我们利用这种加密方式,上一个文章的手撸自动登录就GG了,因为存入session中的是加密过后的密码,不能利用加密后的密码直接登录。
Shiro密码加密 盐值加密相关推荐
- java shiro盐值加密_java中spring-shiro实现密码的MD5盐值加密
看了网上很多教程,都提到有配置spring shiro的密码加密方式,甚至给出了自定义的Class来实现.却很少有通过配置来解决的. 密码的盐值加密方式应该是非常通用的,也可以算是基础吧.按理说spr ...
- 【密码加密】【MD5加密】【盐值加密】
加密方式 MD5加密 盐值加密 实际开发中的应用 MD5加密 MD5加密方式,可以对文件或者值进行读取加密,并且这个密码是不可逆的,也就是不能被破解 利用第三方类库实现加密 //常用的MD5加密 St ...
- C#实现带盐值加密,适配JAVA Shiro加密
C#实现带盐值加密,适配JAVA Shiro加密 前言 核心代码 Java代码 C#代码 注意 前言 工业领域上位机软件与管理系统通常使用不同编程语言实现,比如我们的上位机软件通常使用C#,而MES. ...
- Springboot + Shiro——MD5 盐值加密(配置)
其实这里所说的盐,简单的说,就是一组安全随机数.它会在特定的时候,加入到密码中(一般来说是加密后的密码).从而使密码变得更有味道(从单一简单化到复杂化),更安全. 如何做到? 1). 在 doGetA ...
- Spring Boot 整合 shiro 之盐值加密认证详解(六)
Spring Boot 整合 shiro 之盐值加密认证详解 概述 不加盐认证 加入密码认证核心代码 修改 CustomRealm 新增获取密文的方法 修改 doGetAuthenticationIn ...
- java shiro盐值加密_shiro盐值加密并验证
在数据表中存的密码不应该是123456,而应该是123456加密之后的字符串,而且还要求这个加密算法是不可逆的,即由加密后的字符串不能反推回来原来的密码,如果能反推回来那这个加密是没有意义的.著名的加 ...
- shiro盐值加密(五)
背景: 为了密码的安全性,密码要进行加密操作.通常我们使用的散列加密算法,其加密算法是不可逆的,即不能由密文推算出明文,所以即使数据库管理员或者入侵者知道了你存储在数据库里面的密码,也不会知道你真实的 ...
- shiro—MD5盐值加密
本例为在idea下shiro集成springMVC.仅有一个认证加密方式(一个realm ) 为什么是MD5盐值加密呢?shiro用密码匹配,密码一样,就ok.如果两个用户的密码一样,则就会造成麻烦. ...
- Shiro(三) 身份认证源码分析与 MD5 盐值加密
文章目录 1. 身份认证 2. 身份验证的基本流程 3. 身份验证实现 3.1 在 `login.jsp` 添加登录表单 3.2 添加表单提交的 Controller 3.3 完善 Realm 的身份 ...
最新文章
- 改變人生的21種好習慣
- Hibernate in action阅读笔记-吵吵冷饭-ORM
- POJ 3691 DNA repair AC自动机 + DP
- 【6月月报】新书加印与勘误,七大专栏齐上线,知识星球大改版!
- 关于投资银行和咨询的理解和感悟
- String.valueOf() 和 toString的区别
- 3. 机器学习中为什么需要梯度下降_梯度提升(Gradient Boosting)算法
- 分析Cocos2d-x横版ACT手游源 1、登录
- JS字符串转换为数字,Number(),parseInt()和parseFloat()的区别
- gcc,make和cmake
- hibernate查询list结果集结果都是一样
- 枚举类型的定义和应用
- CarMaker中关于交通目标行人横穿的问题
- 《网络流量分类》部分插图
- 网易校招测试岗位2018
- 时间校准(全网最全最准确方案)完美无解
- 使用Python将一个excel的某些内容导入到新的excel中
- 简要介绍一下Dos/Windows格式文件和Unix/Linux格式文件(剪不断理还乱的\r\n和\n)
- 机械原理(机电)_简要问答_笔记
- Google Dremel数据模型详解(上)