Shiro 1.2新功能DefaultPasswordService解惑

自定义shiro 的密码验证方式 项目环境spring boot 2.1 首先实现自己的验证类 import com.glodon.security.MD5; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.Use... 阅读详情

最开始学习shiro的时候需要自己保存User的salt, 最近系统升级,使用了Shiro1.3发现在1.2的时候Shiro提供了新的DefaultPasswordService来简化Password encode/match工作。很好奇为啥不在需要自己保存User的salt,查看了defaultpasswordservice的源代码,发现了其中的奥秘,具体看Shiro的代码(关注*部分),主要是重新构建Hash,然后从Hash中获取salt来做提交密码的hash,比较计算出来的hash和存储hash是否一致。

      public boolean More ...passwordsMatch(Object submittedPlaintext, String saved) {
          ByteSource plaintextBytes = createByteSource(submittedPlaintext);

          if (saved == null || saved.length() == 0) {
              return plaintextBytes == null || plaintextBytes.isEmpty();
          } else {
              if (plaintextBytes == null || plaintextBytes.isEmpty()) {
                  return false;
              }
          }

          //First check to see if we can ***reconstitute the original hash*** - this allows us to
          //perform password hash comparisons even for previously saved passwords that don't
          //match the current HashService configuration values.  This is a very nice feature
          //for password comparisons because it ensures backwards compatibility even after
          //configuration changes.
          ***HashFormat discoveredFormat = this.hashFormatFactory.getInstance(saved);***

          <strong>if (discoveredFormat != null && discoveredFormat instanceof ParsableHashFormat) {

              ParsableHashFormat parsableHashFormat = (ParsableHashFormat)discoveredFormat;
              **Hash savedHash = parsableHashFormat.parse(saved);**

              return ***passwordsMatch(submittedPlaintext, savedHash)***;
          }</strong>

          //If we're at this point in the method's execution, We couldn't reconstitute the original hash.
          //So, we need to ***hash the submittedPlaintext using current HashService configuration and then
          //compare the formatted output with the saved string.  This will correctly compare passwords***,
          //***but does not allow changing the HashService configuration without breaking previously saved
          //passwords***:

          //The saved text value can't be reconstituted into a Hash instance.  We need to format the
          //submittedPlaintext and then compare this formatted value with the saved value:
          HashRequest request = createHashRequest(plaintextBytes);
          Hash computed = this.hashService.computeHash(request);
          String formatted = this.hashFormat.format(computed);

          return saved.equals(formatted);
      }
public boolean passwordsMatch(Object plaintext, Hash saved) { 
        ByteSource plaintextBytes = createByteSource(plaintext); 

        if (saved == null || saved.isEmpty()) { 
            return plaintextBytes == null || plaintextBytes.isEmpty(); 
        } else { 
            if (plaintextBytes == null || plaintextBytes.isEmpty()) { 
                return false; 
            } 
        } 

        HashRequest request = ***buildHashRequest(plaintextBytes, saved);*** 

        Hash computed = this.hashService.computeHash(request); 

        return saved.equals(computed); 
    }
    protected HashRequest buildHashRequest(ByteSource plaintext, Hash saved) { 
        //keep everything from the saved hash except for the source: 
        return new HashRequest.Builder().setSource(plaintext) 
                //now use the existing saved data: 
                .setAlgorithmName(saved.getAlgorithmName()) 
                .***setSalt(saved.getSalt())*** 
                .setIterations(saved.getIterations()) 
                .build(); 
    } 

要使用defaultpasswordService非常简单就是简单的spring bean,当然你可以通过注入改变迭代次数和加密算法。

<bean name="passwordService" class="org.apache.shiro.authc.credential.DefaultPasswordService" />
MCGS触摸屏数据记录与U盘导出配置全解析 在工业自动化现场,数据记录是设备运行状态分析与故障追溯的基础。HMI触摸屏作为人机交互核心,不仅承担实时监控任务,还负责过程数据的存储与导出。理解数据采集周期、存盘机制与存储介质的匹配原理,能帮助工程师高效配置数据记录功能。合理运用定时存盘、存盘组与U盘导出,可支撑设备趋势分析、报表生成及事故排查。本文以MCGS触摸屏为例,详解数据记录的完整组态流程,并汇总常见配置陷阱与排查思路,为现场调试与长期运维提供可落地的技术参考。 阅读详情

相关推荐

【三维重建】基于多视角图像的三维重建

基于多视角图像的三维重建》

m0_64446860的博客 8758

Shiro学习(五)——密码的加密解密

前言 前面几篇文章的密码都是以明文形式存储。在真实项目中当然不可能明文存储密码,密码一定是以加密的形式存储的。前面我们可以看到当我们给出帐号和密码后,shiro就会去查找ini配置文件或者数据库对应字段来匹配账号密码。那如果我们把存储的密码加密,shiro又如何根据我们提交的明文密码与存储的加密密码匹配呢? Shiro加密与匹配的原理 这里不准备展示源码。相信很多读者看文章时面对大量源码也看得一头雾水,并不能总结出什么来,所以这里大致讲讲思路,有兴趣的读者可以自行跟踪源码。这里以读取ini文件为例

sadoshi的专栏 6812

海康威视摄像机SDK二次开发--提取音频保存至文件

由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释 文件结构 其中CameraInfo内容可以参看海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中 HIKSDKSaveRealData中的内容 package ClientDemo; import ClientDemo.CameraInfo; import com.sun.jna.NativeLong; import

RichardoMu的博客 3172

使用Shiro1.2中的PasswordService实现密码加密存储和比对

在Shiro之前的版本中,密码加密一般采用如下代码:String digestString = new Sha256Hash(password, salt, numIterations).toBase64(); 密码比对一般采用HashedCredentialsMatcher或Sha256CredentialsMatcher等相关比对类,在新版1.2中,增添了一项重要的功能就是密码服务,使得加密

我的博客 1万+

Windows 10/11 零基础配置 SillyTavern 连接 Claude API 完整指南(含 Node.js 环境搭建)

本文提供Windows 10/11系统下零基础配置SillyTavern连接Claude API的完整教程,涵盖Node.js环境搭建、SillyTavern初始化及API连接配置等关键步骤。通过详细的操作指南和实用技巧,帮助用户快速搭建AI聊天界面并优化对话体验,实现与Claude AI的高效交互。

weixin_30642561的博客 134

【图像超分】论文复现:经典超分 | SAN的Pytorch源码复现,跑通源码,适配高版本的python/pytorch/cuda,使用EDSR-PyTorch进行训练和测试

本文介绍了单幅图像超分辨率重建方法SAN(二阶注意网络)的代码实现。文章详细说明了在高版本Python/Pytorch环境下适配SAN源码的方法,并提供了修改后的完整代码和预训练模型下载链接。 主要亮点包括: 将SAN模型实现整合到EDSR-Pytorch框架中,解决了高版本环境下的兼容性问题 提供了完整的数据集准备指南(DIV2K训练集和5个测试集) 给出了详细的测试命令,涵盖x2、x3、x4不同放大倍率 公开了预训练模型和可视化结果的下载资源 提供了修改后的适配高版本环境的代码。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1412

第五章 Shiro编码/加密

第五章 编码/加密——《跟我学Shiro》 博客分类: 跟我学Shiro 跟我学Shiro    目录贴: 跟我学Shiro目录贴   在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码。比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储。   5.1 编码/解码  Shiro提供了base64和16

rrz634171的专栏 978

基于 Qt C++ 开发一套西门子量子测量系统的控制与数据采集平台

sensorIdCombo->addItems({"QTS-100-001 (温度)", "QPG-200-001 (压力)", "QDS-300-001 (位移)"});precisionTable->setHorizontalHeaderLabels({"传感器ID", "类型", "标称精度", "实际精度", "校准状态"});QWidget *dispWidget = createSensorWidget("量子位移", "mm (±1μm)", 50.0, 0.001);// 传感器状态更新。

寒寒豆豆软件公司的博客 253

4.shiro的加密和解密

shiro的加密和解密 1.PasswordService 和CredentialsMatcher 1.Shiro 提供了 PasswordService 及 CredentialsMatcher 用于提供加密密码及验证密码服务。 2.Shiro 默认提供了 PasswordService 实现 DefaultPasswordService;CredentialsMatcher 实现 P...

plumblum的博客 5425

【补充篇】三万字了解AUTOSAR软件架构(一)

主要讲解了AUTOSAR软件架构的分层及各个栈的作用

weixin_47571898的博客 1117

【文献笔记】ICCV 2021 | Point Transformer

作者提到,特别适合点云处理,因为自注意力机制是的核心,本质上就是一个集合算子:它对输入元素具有顺序不变性和数量不变性3D点云是无序的,即使改变点云txt文件中的点顺序也不会有任何影响。自注意力机制天然具有排列不变性,因为它通过对所有"点对"的关系进行建模来处理输入,而不依赖于任何特定的输入顺序点云数据通常覆盖了3D空间中的对象或场景,理解这些数据需要捕捉点与点之间复杂的空间关系。自注意力机制能够有效的捕捉这些关系,因为它为每个"点对"赋予一个。

m0_55908255的博客 965

Shiro--编码/加密(五)

在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码。比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储。 5.1 编码/解码 Shiro提供了base64和16进制字符串编码/解码的API支持,方便一些编码解码操作。Shiro内部的一些数据的存储/表示都使用了base64和16进制字符串。 String str = "hello"; String base64Encoded = Base64.encodeToString(str.g.

weixin_42073629的博客 368

使用 MATLAB/Simulink 搭建一个 无人机群间数据交换与协同控制仿真系统

本文提供了一份详细的Simulink无人机群协同控制仿真教程。主要内容包括:无人机群系统架构设计(去中心化网络、通信分层)、三维运动建模、空-空通信链路实现(距离判断、无线信道)、分布式Consensus控制算法开发,以及性能评估指标设定。教程采用模块化设计思路,通过ModelReference构建多无人机并行模型,并给出了MATLAB函数实现关键算法。最后展示了预期仿真结果(收敛时间<15s、位置偏差<2m)和进阶应用方向(编队飞行、AI协同等),帮助读者掌握群体智能系统的建模与仿真方法。

amy_mhd的博客 155

Shiro会话管理和加密

1.1会话管理 Shiro提供了完整的企业会话管理功能,不依赖于底层容器(如:Tomcat),不管是J2SE还是J2EE环境都可以使用,提供了会话管理,会话事件监听,会话存储/持久化,容器无关的集群,失效/过去支持,对web的透明支持,SSO单点登入的支持特性. 1.2 会话相关APL Subject.getSession():获取会话,等价于Subject.getSession(true),即如果当前没有创建session对象会创建一个;Subject.getSession(false),如果当前

weixin_47306135的博客 307

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Shiro编码加密

base64 编码/解码 16进制字符串编码/解码 MD5 SHA String md5 = new Md5Hash(pass, salt,2).toString(); String sha256 = new Sha256Hash(pass, salt, 2).toBase64(); String hash = new SimpleHash("SHA-1", pass, salt, 2).toHex(); PasswordService passwordService 默认使用 DefaultPasswo

fhxyryxc的博客 164

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Shiro 学习笔记(6)—— 加密

一般地,密码这样的高度敏感的字段,我们应该是使用一种不可破解的算法加密以后存储到我们的数据库中。当用户登录的时候,在用户输入用户名正确(在库中存在)的前提下,将用户输入的密码使用同样的算法加密以后得到的字符串和数据库中的密文密码进行匹配,匹配成功,则认证通过。如果我们不指定 Realm 使用 PasswordMatcher 的实现类的话,默认的匹配方式就是使用字符串是否相同这样的匹配方式,显然不能达到我们的要求。在我们之前的例子中,我们的密码在 Realm 里返回认证信息的时候,写的都是明文。

web13170611647的博客 430

shiro 修改默认加密方式

        @Bean public PasswordService getPasswordService() { DefaultPasswordService service = new DefaultPasswordService(); DefaultHashService defaultHashService = new DefaultHashService(); // de...

lwb6096的博客 6754

Java安全框架Shiro:认证授权与会话管理实战

在Java应用开发中,安全框架是实现认证(Authentication)和授权(Authorization)的核心组件。Apache Shiro作为轻量级安全框架,通过简洁的API设计降低了安全功能的实现难度。其核心原理基于Subject概念,将用户身份验证、权限控制和会话管理等功能模块化。技术价值体现在支持多种认证方式、细粒度权限控制以及独立于容器的会话管理。典型应用场景包括Web应用安全控制、API接口保护和微服务架构中的身份验证。Shiro特别适合需要快速实现安全功能的中小型项目,其内置的密码加密和缓

weixin_33895516的博客 423

SpringBoot 集成 Shiro框架 简单配置

SpringBoot集成Shiro框架 pom.xml添加 &lt;!-- shiro框架--&gt;         &lt;dependency&gt;                &lt;groupId&gt;org.apache.shiro&lt;/groupId&gt;                &lt;artifactId&gt;shiro-core&lt;/artif...

OtherWorldly的博客 305

使用Apache Shiro进行身份认证-密码加密

在进行身份认证时,用户的密码一般是用密文的形式存放在数据库中。这样在做比对时不能直接使用用户提交的明文口令。 在Shiro中使用org.apache.shiro.authc.credential.SimpleCredentialsMatcher做凭证信息的比对。SimpleCredentialsMatcher实现了 凭证信息的明文比对,即对凭证信息不做任何处理。 通过HashedCreden

王浩的技术博客 1万+

第五章 编码/加密——《跟我学Shiro》

目录贴: 跟我学Shiro目录贴   在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码。比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储。   5.1 编码/解码  Shiro提供了base64和16进制字符串编码/解码的API支持,方便一些编码解码操作。Shiro内部的一些数据的存储/表示都使用了base64和16进

Ethan_Fu的专栏 798

Shiro简单加密服务

编码/加密在涉及到密码存储问题上,应该加密 / 生成密码摘要存储,而不是存储明文密码。比如之前的 600w csdn 账号泄露对用户可能造成很大损失,因此应加密 / 生成不可逆的摘要方式存储。Shiro简单加密服务PasswordService/CredentialsMatcherShiro 提供了 PasswordService 及 CredentialsMatcher 用于提供加密密码及验证密

码农博士的博客 534

shiro编码/解码、加密/解密

package com.github.zhangkaitao.shiro.chapter5.test; import org.apache.shiro.codec.Base64; import org.apache.shiro.codec.Hex; import org.apache.shiro.crypto.AesCipherService; import org.apache.shiro....

ldk99_的博客 2419

shiro 提供的AES 对称式加密/解密算法

来源:http://jinnianshilongnian.iteye.com/blog/2021439AesCipherService aesCipherService = new AesCipherService(); aesCipherService.setKeySize(128); //设置key长度 //生成key Key key = aesCipherService.gene...

莲藕码夫的博客 3218

SpringBoot+MyBatis用户注册实战

spring官网 通过spring官网初始化SpringBoot项目 使用idea工具打开Springboot项目,项目结构 添加pom依赖 <!--springboot启动类--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId>

Java721的博客 2万+
上一篇: Sonar指定Java项目分析文件
下一篇: Shiro使用自己的SessionId管理和rememberMe配置
开心的D哥
博客等级 码龄22年 63粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值