【Shiro】07 散列算法 & 凭证配置
【散列算法概述】
用于生成数据的摘要信息,不可逆算法,用于存储密码或者密文数据。
常见散列算法类型:MD5、SHA
一般进行散列时提供一个”盐“,即系统知道的”干扰数据“
这样生成的密文更加难以被破解
【盐?】
加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令跟一个n位随机数相关联,这个n位随机数叫做”盐“(salt)。
加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联。
无论何时只要口令改变,随机数就改变。
随机数以未加密的方式存放在口令文件中,这样每个人都可以读。
不再只保存加密过的口令,而是先将口令和随机数连接起来然后一同加密,加密后的结果放在口令文件中。
演示案例:
MD5加密
@Test
public void calcTest() {
String source = "123456"; Md5Hash hash1 = new Md5Hash(source);
System.out.println("使用MD5加密后的结果:"+hash1.toString()); Md5Hash hash2 = new Md5Hash(source, "北京武汉");
System.out.println("使用MD5加密并加盐后的结果:"+hash2.toString()); Md5Hash hash3 = new Md5Hash(source, "北京武汉", 2); // 一般两次就够了
System.out.println("使用MD5加密加盐并散列两次后的结果:"+hash3.toString());
}
结果:
使用MD5加密后的结果:e10adc3949ba59abbe56e057f20f883e
使用MD5加密并加盐后的结果:19a45a53e8924a742f77183b8878a5fb
使用MD5加密加盐并散列两次后的结果:b4f48723743cc5bfa7c1716296703ce1 Process finished with exit code 0
封装的加密工具类:
public class EncryptionUtil {
private EncryptionUtil(){}
/**
* MD5加密
* 对秘密明文加密
* @param plaintext 密码明文
* @param salt ”盐“
* @param hashFrequency 散列次数
* @return 密文
*/
public static String md5Encryption(String plaintext, Object salt, Integer hashFrequency) {
return new Md5Hash(plaintext, salt, hashFrequency).toString();
}
/**
* SHA1加密
* @param plaintext 密码明文
* @param salt ”盐“
* @param hashFrequency 散列次数
* @return 密文
*/
public static String sha1Encryption(String plaintext, Object salt, Integer hashFrequency) {
return new Sha1Hash(plaintext, salt, hashFrequency).toString();
}
}
【凭证加密配置】
方案一,在自定义Realm类的构造器中实现:
public UserRealm() {
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
hashedCredentialsMatcher.setHashAlgorithmName("md5"); // 指定加密算法名称
hashedCredentialsMatcher.setHashIterations(2); // 指定散列次数
this.setCredentialsMatcher(hashedCredentialsMatcher);
}
方案二,在shiro.ini文件中配置:
[main] # 配置凭证匹配器
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
credentialsMatcher.hashAlgorithmName=md5
credentialsMatcher.hashIterations=2 # 自定义Realm对象
userRealm = cn.echo42.shiro.realm.userRealm
userRealm.credentialsMatcher = $credentialsMatcher # 安全管理器
securityManager=org.apache.shiro.mgt.DefaultSecurityManager
securityManager.realm=$userRealm
方法三,在业务程序中配置:
就是把方案一放在外面处理了
@Test
public void testSample() {
log.info("My First Apache Shiro Application"); DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); UserRealm userRealm = new UserRealm();
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
hashedCredentialsMatcher.setHashAlgorithmName("md5");
hashedCredentialsMatcher.setHashIterations(2);
userRealm.setCredentialsMatcher(hashedCredentialsMatcher); defaultSecurityManager.setRealm(userRealm); SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject();
AuthenticationToken userToken = new UsernamePasswordToken(username,password);
subject.login(userToken);
}
其次,对应的也需要更改认证信息对象(UserRealm):
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
// 通过提交的令牌获取信息(用户名称?)
String principal = authenticationToken.getPrincipal().toString();
// 或者是业务层调取记录对象用来验证 User user=userService.queryUserByUserName(username);
// 如果这里从数据库获取的用户名核对成功 返回一个简单的验证结果对象 // 用户名,令牌凭证(就是密码),和这个类的限定名
if ("username".equals(principal)) // return new SimpleAuthenticationInfo(principal, authenticationToken.getCredentials(), this.getName());
return new SimpleAuthenticationInfo(
principal, // 任意对象
authenticationToken.getCredentials(), // 从数据库返回的密文密码
ByteSource.Util.bytes("使用的盐,这里可以动态也可以是这种静态的"),
getName() // 类名
);
// 否则返回空,表明查不到
return null;
}
【Shiro】07 散列算法 & 凭证配置的更多相关文章
- shiro进行散列算法操作
shiro最闪亮的四大特征:认证,权限,加密,会话管理 为了提高应用系统的安全性,这里主要关注shiro提供的密码服务模块: 1.加密工具类的熟悉 首先来个结构图,看看shiro提供了哪些加密工具类: ...
- Shiro入门学习之散列算法与凭证配置(六)
一.散列算法概述 散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5.SHA等,一般进行散列时最好提供一个salt(“盐”),什么意思?举个栗子 ...
- shiro中自定义realm实现md5散列算法加密的模拟
shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...
- PKI和加密,散列算法
Day 11-PKI和加密,散列算法 PKI(Public Key Infrastructure公钥基础设施) 1 PKI(Public Key Infrastructure公钥基础设施)回顾学习 - ...
- Android数据加密之SHA安全散列算法
前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好 ...
- 个人理解c#对称加密 非对称加密 散列算法的应用场景
c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下 对称加密 通过同一密匙进行加密和解密.往往应用在内部数据传输情况下.比如公司a程序 和B程序 ...
- C# SHA1散列算法
C# SHA1散列算法 /// <summary> /// C# SHA1散列算法 /// </summary> /// <param name="str&qu ...
- SHA安全散列算法简析
1 SHA算法简介 1.1 概述 SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散 ...
- [转帖]什么是安全散列算法SHA256?
什么是安全散列算法SHA256? http://8btc.com/article-136-1.html 发布者: 无主之地 发表于: 2013-10-1 01:31 78152 2 分享 安全散列 ...
- 什么是安全散列算法SHA256?
安全散列算法SHA(Secure Hash Algorithm)是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1.SHA-224.S ...
随机推荐
- ETL工具-nifi干货系列 第八讲 处理器PutDatabaseRecord 写数据库(详细)
1.本节通过一个小例子来讲解下处理器PutDatabaseRecord,该处理器的作用是将数据写入数据库. 如下流程通过处理器GenerateFlowFile 生成数据,然后通过处理器JoltTran ...
- 将链表以m长度为一组反转链表
一群友分享的阿里面试题 1.将head链表以m为组反转链表(不足m则不反转): 例子:假设m=3. 链表 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> ...
- 前端使用 Konva 实现可视化设计器(15)- 自定义连接点、连接优化
前面,本示例实现了折线连接线,简述了实现的思路和原理,也已知了一些缺陷.本章将处理一些缺陷的同时,实现支持连接点的自定义,一个节点可以定义多个连接点,最终可以满足类似图元接线的效果. 请大家动动小手, ...
- 泛型模板化设计DEMO
泛型模板化设计DEMO 1. 定义Result泛型类 package com.example.core.mydemo.java.fanxing; public class Result<T> ...
- 搭建springboot redis项目
1.创建项目 如果出现init失败(需要等待网络可以正常连接) 或者运行主类的时候报错(错误: 找不到或无法加载主类),需要重新导入maven项目再重新编译试试. 2.引入pom jar <?x ...
- spring与设计模式之一工厂模式
大家都说要多阅读spring的代码,这非常在理,毕竟spring的代码是许许多多杰出工程师的结晶,是业界多年的累积. 最近也不是非常忙,所以准备记录一系列的相关代码. 工厂模式是所有人都会的模式,是最 ...
- Springboot3.0+spring6.0+JDK17+配置jsp和打war包
由于某些缘故,公司的产品需要升级,但并不希望花费大量时间重写前端代码(原来的就不是前后分离的).所以虽然spring和springboot都升级为最新的版本,但是依然还是需要支持jsp,并继续用打包为 ...
- Shell脚本实现Linux回收站
前言 到目前为止,非图形化的Linux还没有回收站的命令. 那么,我们如果不小心将某一个文件删掉了,那就只能数据恢复了.如果这也不行,那就等着哭吧. 最新代码在我的github:https://git ...
- 蚁群算法及 TSP 问题上的应用
群智能(Swarm intelligence) 自然界动物群,称之为群. 群的特征: 相互作用的相邻个体的集合 个体的行为简单,既有竞争又有协作 智能化的集体行为(1+1>2): 个体间不仅能够 ...
- .NET下 支持大小写不敏感的JSON Schema验证方法
问题 有很多应用程序在验证JSON数据的时候用到了JSON Schema. 在微服务架构下,有时候各个微服务由于各种历史原因,它们所生成的数据对JSON Object属性名的大小写规则可能并不统一,它 ...