【散列算法概述】

用于生成数据的摘要信息,不可逆算法,用于存储密码或者密文数据。

常见散列算法类型: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 散列算法 & 凭证配置的更多相关文章

  1. shiro进行散列算法操作

    shiro最闪亮的四大特征:认证,权限,加密,会话管理 为了提高应用系统的安全性,这里主要关注shiro提供的密码服务模块: 1.加密工具类的熟悉 首先来个结构图,看看shiro提供了哪些加密工具类: ...

  2. Shiro入门学习之散列算法与凭证配置(六)

    一.散列算法概述 散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5.SHA等,一般进行散列时最好提供一个salt(“盐”),什么意思?举个栗子 ...

  3. shiro中自定义realm实现md5散列算法加密的模拟

    shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...

  4. PKI和加密,散列算法

    Day 11-PKI和加密,散列算法 PKI(Public Key Infrastructure公钥基础设施) 1 PKI(Public Key Infrastructure公钥基础设施)回顾学习 - ...

  5. Android数据加密之SHA安全散列算法

    前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好 ...

  6. 个人理解c#对称加密 非对称加密 散列算法的应用场景

    c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下 对称加密 通过同一密匙进行加密和解密.往往应用在内部数据传输情况下.比如公司a程序 和B程序 ...

  7. C# SHA1散列算法

    C# SHA1散列算法 /// <summary> /// C# SHA1散列算法 /// </summary> /// <param name="str&qu ...

  8. SHA安全散列算法简析

    1 SHA算法简介 1.1 概述 SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散 ...

  9. [转帖]什么是安全散列算法SHA256?

    什么是安全散列算法SHA256? http://8btc.com/article-136-1.html 发布者: 无主之地 发表于: 2013-10-1 01:31 78152 2 分享   安全散列 ...

  10. 什么是安全散列算法SHA256?

    安全散列算法SHA(Secure Hash Algorithm)是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1.SHA-224.S ...

随机推荐

  1. react 装饰器

    使用装饰器定义 装饰器是一种函数,写成 @函数名.它可以放在类和类方法的定义前面.react脚手架创建的项目默认是不支持装饰器,需要手动安装相关模块和添加配置文件. 安装相关模块 npm i -D c ...

  2. 剑指Offer-57.二叉树的下一个结点(C++/Java)

    题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 分析: 二叉树的中序遍历是左根右,所以如果一个结点的右子 ...

  3. #define 用法解法

    宏的优点是能整理代码 缺点是宏替换来的代码需要人工解除宏后才能暴漏源代码 改底层时候是需要解一解的 它可以做到main函数中只有一个宏字母 这个宏定义时候,定义成了几个函数的源代码 所以main里面就 ...

  4. 《Android开发卷——自定义日期选择器(一)》

    (小米手机) (中兴手机) 在实际开发中,Google官方提供的时间选择器API已经不能满足于我们的需要了,所以很多公司都是采用自定义的形式来实现日期选择器. 这个例子很简单,定义三个NumberPi ...

  5. Eclipse build js卡死 Eclipse 编译太卡,耗时太长解决

    Eclipse build js卡死 Eclipse 编译太卡,耗时太长解决 问题描述:编译停止在js编译中,原来是js的问题 1.首选项-javaScript-Validator-Errors/Wa ...

  6. idea编译报错 Lombok运行测试类报错 jar依赖冲突解决

    idea编译报错 Lombok运行测试类报错 jar依赖冲突解决 1.现象是idea编译,运行项目的时候是没有问题,可以正常跑起来.2.运行junit测试类的时候,报错提示 lombok找不到类,解决 ...

  7. Linux高级命令

    重定向 重定向也称为输出重定向,用于将命令的输出保存到目标文件. 使用方法:> 文件名 或 >> 文件名.前者会覆盖文件内容,后者会追加内容到文件. 查看文件内容命令 cat: 显示 ...

  8. 在Linux驱动中使用proc子系统

    在Linux驱动中使用proc子系统 背景 proc文件系统是个简单有用的东东:驱动创建一个proc虚拟文件,应用层通过读写该文件,即可实现与内核的交互. 本文适用于3.10以后的内核,v3.10以前 ...

  9. 全志T113-i+玄铁HiFi4开发板(双核ARM Cortex-A7 )规格书

    评估板简介 创龙科技TLT113-EVM是一款基于全志科技T113-i双核ARM Cortex-A7 + 玄铁C906 RISC-V + HiFi4 DSP异构多核处理器设计的国产工业评估板,ARM ...

  10. 【Hadoop报错】The directory item limit is exceeded: limit=1048576 items=1048576

    问题描述: 调度系统执行hive任务失败,一直执行失败,报错如下: java.io.IOException: java.net.ConnectException: Call From #HostNam ...