Shiro-05-shiro 基础知识补充密码学+哈希散列

密码学

密码术是隐藏或混淆数据的过程,因此窥探眼睛无法理解它。

Shiro的加密目标是简化JDK的加密支持并使之可用。

需要特别注意的是,密码通常不是特定于主题的,因此Shiro API的其中一个领域不是特定于主题的。

即使未使用“主题”,您也可以在任何地方使用Shiro的加密支持。

Shiro真正侧重于其加密支持的两个领域是加密哈希(又名消息摘要)和加密密码领域。

让我们更详细地看看这两个。

散列

如果您使用了JDK的MessageDigest类,您很快就会意识到使用它有点麻烦。它具有笨拙的基于静态方法的基于工厂的API,而不是面向对象的API,因此您不得不捕获可能永远不需要捕获的已检查异常。如果您需要十六进制编码或Base64编码的消息摘要输出,则由您自己决定-两者均不提供标准的JDK支持。

Shiro通过干净直观的哈希API解决了这些问题。

例如,让我们考虑MD5散列文件并确定该散列的十六进制值的相对常见的情况。称为“校验和”,通常在提供文件下载时使用-用户可以对下载的文件执行自己的MD5哈希,并断言其校验和与下载站点上的校验和匹配。如果它们匹配,则用户可以充分假设文件在传输过程中未被篡改。

在没有Shiro的情况下,您可以尝试以下操作:

  1. 将文件转换为字节数组。 JDK中没有任何东西可以帮助您解决此问题,因此您需要创建一个辅助方法,该方法可以打开FileInputStream,使用字节缓冲区并抛出适当的IOException等。

  2. 使用MessageDigest类对字节数组进行哈希处理,以处理适当的异常,如下面的清单12所示。

  3. 将散列字节数组编码为十六进制字符。 JDK中也没有任何东西可以提供帮助,因此您需要创建另一个帮助器方法,并可能在实现中使用按位运算和移位。

  • Listing 12. JDK’s MessageDigest
try {
    MessageDigest md = MessageDigest.getInstance("MD5");
    md.digest(bytes);
    byte[] hashed = md.digest();
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
} 

对于如此简单且相对常见的事物而言,这是一项巨大的工作。

现在,说明如何使用Shiro进行完全相同的操作。

String hex = new Md5Hash(myFile).toHex(); 

使用Shiro简化所有工作时,了解正在发生的事情非常简单和容易。

SHA-512哈希和密码的Base64编码也很容易。

String encodedPassword =
    new Sha512Hash(password, salt, count).toBase64();

您会看到Shiro在很大程度上简化了哈希和编码,从而在此过程中节省了一些理智。

密码

密码是可以使用密钥可逆地转换数据的密码算法。我们使用它们来保护数据安全,尤其是在传输或存储数据时,尤其是在数据容易被撬开的时候。

如果您曾经使用过JDK密码API,尤其是javax.crypto.Cipher类,那么您就会知道,驯服它可能是一件极其复杂的事情。对于初学者来说,每种可能的Cipher配置始终由javax.crypto.Cipher的实例表示。

需要做公钥/私钥加密吗?

您使用密码。是否需要使用分组密码进行流操作?您使用密码。是否需要创建AES 256位密码来保护数据?您使用密码。你明白了。

以及如何创建所需的Cipher实例?

您创建了一个复杂的,不直观的,用令牌分隔的密码选项字符串,称为“转换字符串”,并将该字符串传递给Cipher.getInstance静态工厂方法。使用这种密码选项字符串方法,没有类型安全性来确保您使用有效的选项。这也隐含地意味着没有JavaDoc可以帮助您了解相关选项。而且,即使您知道配置正确,也需要处理经过检查的异常,以防您的字符串格式错误。如您所见,使用JDK Ciphers是一项繁琐的任务。这些技术很久以前曾经是Java API的标准,但是时代已经改变,我们希望有一种更简单的方法。

Shiro试图通过引入其CipherService API简化整个密码算法的概念。

大多数开发人员在保护数据时都希望使用CipherService:一种简单,无状态,线程安全的API,可以在一个方法调用中完整地加密或解密数据。您所需要做的就是提供密钥,然后可以根据需要加密或解密。

例如,可以使用256位AES加密,如下面的清单13所示。

  • Listing 13. Apache Shiro’s Encryption API
AesCipherService cipherService = new AesCipherService();
cipherService.setKeySize(256);
//create a test key:
byte[] testKey = cipherService.generateNewKey();

//encrypt a file’s bytes:
byte[] encrypted =
    cipherService.encrypt(fileBytes, testKey);

与JDK的Cipher API相比,Shiro示例更简单:

  • 您可以直接实例化CipherService-没有奇怪或令人困惑的工厂方法。

  • 密码配置选项表示为与JavaBeans兼容的getter和setter-没有奇怪且难以理解的“转换字符串”。

  • 加密和解密在单个方法调用中执行。

  • 没有强制检查的异常。 如果需要,请捕获Shiro的CryptoException。

Shiro的CipherService API还有其他好处,例如既支持基于字节数组的加密/解密(称为“块”操作),又支持基于流的加密/解密(例如,加密音频或视频)。

Java密码术不必太痛苦。

Shiro的密码学支持旨在简化您保护数据安全的工作。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/395400.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android 架构组件全示例

Android 架构组件全示例 Android架构组件属于Jetpack的组成部分,彻底改变了开发人员构建健壮且易于维护的Android应用程序的方式。通过Room、Lifecycle-aware组件、ViewModels、LiveData、Paging、Navigation、ViewBinding和WorkManager等组件,开发人员…

K8s进阶之路-命名空间级-服务发现 :

服务发现: Service(东西流量):集群内网络通信、负载均衡(四层负载)内部跨节点,节点与节点之间的通信,以及pod与pod之间的通信,用Service暴露端口即可实现 Ingress&#…

python绘制k线图均线图

AAPL.csv 数据文件 Date,Close,Volume,Open,High,Low 06/23/2023,$186.68,53117000,$185.55,$187.56,$185.01 06/22/2023,$187.00,51245330,$183.74,$187.045,$183.67 06/21/2023,$183.96,49515700,$184.90,$185.41,$182.5901 06/20/2023,$185.01,49799090,$184.41,$1…

unity学习(15)——服务器组装(1)

1.新建好的c#项目如下: 文件夹中内容如下: 此时已经可以通过vs2022打开.sln文件,就可以打开项目了。 2.我们把逆向后(主程序)的内容的代码粘贴过去。有些逆向功底,很快可以定位到,服务器的入口…

uniapp项目准备工作

1.封装请求 export const baseUrl function getHeaders () {let token uni.getStorageSync(token)let header {"access-token":token,// X-Requested-With: XMLHttpRequest,Content-Type: application/json; charsetUTF-8}return header } function reLogin(){/…

Leetcoder Day14|二叉树part03

语言:Java/C 104.二叉树的最大深度​​​​​​​ 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7]&#xf…

如何配置OSS中的文件是预览还是下载

如何决定文件是预览还是下载 1. 首先需要绑定自己的二级域名,下载时使用自己的二级域名下载 链接:关于绑定域名的官方文档 2. 文件需要配置正确的请求头 链接: 关于设置文件Content-Type的官方文档 2.1 设置或修改文件请求头包含多种方式…

【C++】C++11中

C11中 1.lambda表达式2.可变参数模板3.包装器 1.lambda表达式 在前面我们学习过仿函数。仿函数的作用到底是干什么的呢? 它为了抛弃函数指针! 主要是因为函数指针太难学了 就比如下面这个,看着也挺难受的。 它的参数是一个函数指针&#x…

IO线程-day2

1> 使用fread和fwrite完成两个文件的拷贝 程序&#xff1a; #define MAXSIZE 1024 #include<myhead.h>int main(int argc, char const *argv[]) {FILE *srcfpNULL;FILE *destfpNULL;if(!(srcfpfopen("pm.bmp","r")))PRINT_ERR("");if…

【漏洞复现-通达OA】通达OA video_file.php 任意文件下载漏洞

一、漏洞简介 通达OA video_file.php文件存在任意文件下载漏洞&#xff0c;攻击者通过漏洞可以读取服务器敏感文件。 二、影响版本 ● 通达OA2011 三、资产测绘 ● hunterapp.name"通达 OA" ● 特征 四、漏洞复现 GET /general/mytable/intel_view/video_file.…

比特浏览器bit_selenium3bit_selenium4使用

bit_selenium3 from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options from bit_api import *# /browser/open 接口会返回 selen…

【C/C++】实现Reactor高并发服务器 完整版

代码结构 文件介绍 InetAddress.h InetAddress类 ip和端口设置 Socket.h Socket类 设置fd Epoll.h epollfd 管理类 Channel.h Channel类 管理epoll以及对应回调函数实现 EventLoop.h EventLoop事件循环类 TcpServer.h 服务器类 tcpepoll.cpp 主函数 InetAddress.h #if…

腾讯云OSS文件上传功能

腾讯云COS介绍 腾讯云COS&#xff08;Cloud Object Storage&#xff09;是一种基于对象的存储服务&#xff0c;用于存储和管理海量的非结构化数据&#xff0c;如图片、音视频文件、备份数据等。它具有以下特点和优势&#xff1a; 高可靠性&#xff1a;采用分布式存储架构&…

什么是485远程水表?

485远程水表是一种利用RS485通信协议进行数据传输的智能水表&#xff0c;它具有远程读数、实时监控、数据存储等功能&#xff0c;为水资源管理和居民用水提供了便捷。在我国&#xff0c;随着物联网、大数据等技术的发展&#xff0c;485远程水表得到了广泛的应用&#xff0c;为智…

数据库索引面试的相关问题

查看索引的执行计划 索引失效的情况 1、索引列上做了计算&#xff0c;函数&#xff0c;类型转换等操作。索引失效是因为查询过程需要扫描整个索引并回表。代价高于直接全表扫描。 Like匹配使用了前缀匹配符“%abc” 字符串不加引号导致类型转换。 原因&#xff1a; 常见索…

Java Thread 线程安全问题 上锁 解锁

模拟问题 package com.zhong.thread.usethread;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;/*** ClassName : ThreadProject* Description : 线程安全问题小案例* Author : zhx* Date: 2024-02-19 13:21*/ public class ThreadPr…

postman也不行!IDEA接口调试插件

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

树和堆的精讲

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

MySQL的基础架构

文章目录 前言MySQL的基础架构总结 前言 你使用 MySQL 开发&#xff0c;你知道 MySQL 的基础架构吗&#xff1f;本文带你来入门MySQL 的基础架构 MySQL的基础架构 MySQL 是我们经常使用到的数据库。它的基础架构分为 server 层与存储引擎层。 server 层&#xff1a;用于存储…

nacos 2.3.1-SNAPSHOT 源码springboot方式启动(详细)附改造工程地址

文章时间是2024-2-18日&#xff0c;nacos默认develop分支&#xff0c;最新版是2.3.1-SNAPSHOT版本。 我们这里就以nacos最新版进行改造成springboot启动方式。 1. Clone 代码 nacos github地址&#xff1a;https://github.com/alibaba/nacos.git 根据上面git地址把源码克隆到…