Shiro 框架的MD5加密算法实现原理
直接上代码:该代码可以直接用于项目中做MD5加密,加盐加密,多层散列加密
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays; public class ShiroMd5 {
private static final char[] DIGITS = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; public static void main(String[] args) {
ShiroMd5 shiroMd5 = new ShiroMd5();
String pwd = "123456";
String salt = "saltTest";
int hashNumber =1;
String md5SaltHash = shiroMd5.getMd5SaltHash(pwd, salt, hashNumber);
System.out.println(md5SaltHash);
} /**
* 加密步骤:
* @param pwd
* @param salt
* @param hashNumber
* @return
* 说明:shiro 源码提供的方法支持多种类型变量加密:这里只使用String类型 String pwd, String salt
*/
public String getMd5SaltHash(String pwd, String salt, int hashNumber){
if(pwd == null || salt == null) return null;
try {
//shiro 官方默认是使用UTF-8编码格式
byte[] pwdBytes = pwd.getBytes("UTF-8");
byte[] saltBytes = salt.getBytes("UTF-8");
//加密规则:先加盐后加密,再多次散列加密
byte[] hash = hash(pwdBytes, saltBytes, hashNumber);
//生成的hash 是16位的byte;通过encode 方法对每一位(byte)对应生成两位char
char[] encode = encode(hash);
//char 转 String
return new String(encode); } catch (UnsupportedEncodingException e) {
e.printStackTrace();
} return null;
} /**
* 使用JDK 自带的MessageDigest 加密实现
* @param bytes
* @param salt
* @param hashIterations
* @return
*/
protected byte[] hash(byte[] bytes, byte[] salt, int hashIterations) {
//java.security.MessageDigest: jdk 自带的类
MessageDigest digest = this.getDigest("MD5");
//加盐:digest.update(salt);
if (salt != null) {
digest.reset();
digest.update(salt);
}
//第一次散列加密: digest.digest(bytes);
byte[] hashed = digest.digest(bytes);
//多次散列加密:判断
int iterations = hashIterations - 1;
for(int i = 0; i < iterations; ++i) {
digest.reset();
hashed = digest.digest(hashed);
}
return hashed;
} /**
* 创建MessageDigest 加密类
* @param algorithmName
* @return
*/
protected MessageDigest getDigest(String algorithmName) {
try {
return MessageDigest.getInstance(algorithmName);
} catch (NoSuchAlgorithmException var4) {
String msg = "No native '" + algorithmName + "' MessageDigest instance available on the current JVM.";
return null;
}
} /**
*
* @param data
* @return
*/
public static char[] encode(byte[] data) {
int l = data.length;
char[] out = new char[l << 1];//相当于l 乘于 2,位运算速度更快,更符合机器运算规则
int i = 0;
//byte 中的所有值,共16 位,值的范围:-128~127 (2^8)一个字节8位
System.out.println(Arrays.toString(data));
//data 为16 位,每个byte 对应生成两个char;最终的md5 是32位。
//计算方式
for(int n = 0; i < l; ++i) {
out[n++] = DIGITS[(0xf0 & data[i]) >>> 4];//"无符号"右移运算 。先“与”运算,再右移三位,最后取DIGITS常量数组中的字符
out[n++] = DIGITS[0xf & data[i]];//只“与”运算,最后取DIGITS常量数组中的字符
/*--------------格式化输出看看---------S-----*/
System.out.print((0xf0 & data[i]) >>> 4);
System.out.print(" ");
System.out.print(0xf & data[i]);
System.out.print(" ");
//可以看到32位都是正整数,值的范围:0~15,十进制表示16进制的数,通过常量DIGITS[]转成16进制数
/*--------------格式化输出看看----------E----*/
}
System.out.println("\n"+Arrays.toString(out));//最终可以看到32位16进制的字符串:MD5值
return out;
}
}
结果输出:

Shiro 框架的MD5加密算法实现原理的更多相关文章
- 浅谈Shiro框架中的加密算法,以及校验
在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.为什么要加密:网络安全问题是一个很大的隐患,用户数据泄露事件层出不穷,比如12306账号泄露. Shiro提供了base64和1 ...
- Shiro框架 (原理分析与简单实现)
Shiro框架(原理分析与简单实现) 有兴趣的同学也可以阅读我之前分享的:Java权限管理(授权与认证)CRM权限管理 (PS : 这篇博客里面的实现方式没有使用框架,完全是手写的授权与认证,可以 ...
- MD5加密算法原理及其应用
MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆:所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后 ...
- shiro框架总结
一.概念 shiro是一个安全框架,主要可以帮助我们解决程序开发中认证和授权的问题.基于拦截器做的权限系统,权限控制的粒度有限,为了方便各种各样的常用的权限管理需求的实现,,我们有必要使用比较好的安全 ...
- 一起谈谈MD5加密算法
MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆:所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后 ...
- MD5加密算法测试
在用户注册这一块,密码加密保证客户信息安全是最重要的,在网上查询了一些资料,发现加密算法比较流行的有MD5,DES和SHA. 虽然SHA与MD5通过碰撞法被破解了,但是MD5和SHA仍被公认是安全的加 ...
- JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作
1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...
- MD5加密算法的Java版本
网上搜索Java实现MD5的资料很多,错误的也很多. 之前编写的一个阿里云直播鉴权原理算法需要用到MD5算法,网上找了几个,都是不行,浪费了时间,现在贴一个,做备用. import java.secu ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十一):集成 Shiro 框架
Apache Shiro 优势特点 它是一个功能强大.灵活的,优秀开源的安全框架. 它可以处理身份验证.授权.企业会话管理和加密. 它易于使用和理解,相比Spring Security入门门槛低. 主 ...
- Spring Boot + Spring Cloud 实现权限管理系统 (集成 Shiro 框架)
Apache Shiro 优势特点 它是一个功能强大.灵活的,优秀开源的安全框架. 它可以处理身份验证.授权.企业会话管理和加密. 它易于使用和理解,相比Spring Security入门门槛低. 主 ...
随机推荐
- [STM32H7] 实战技能分享,如何让工程代码各种优化等级通吃,含MDK AC5,AC6,IAR和GCC
引出问题: 一个好的工程项目代码,特别是开源类的,如果能做到各种优化等级通吃,是一种非常好的工程案例,这样别人借鉴的时候,可以方便的适配到自己工程里.但实际项目中,针对一款产品代码,我们一般不会 ...
- [转帖]Navicat连接openGauss数据库报错
news/2023/10/19 21:23:19 错误信息:fe_sendauth:invalid authentication request from server:AUTH_REQ_SASL_C ...
- [转帖]15分钟了解TiDB
https://zhuanlan.zhihu.com/p/338947811 由于目前的项目把mysql换成了TiDb,所以特意来了解下tidb.其实也不能说换,由于tidb和mysql几乎完全兼容, ...
- [转帖]Linux IO调度之队列、队列深度
有关数据结构 请求队列:struct request_queue 请求描述符:struct request 队列深度 可以在端口队列中等待IO请求数量: 具体代表其值的是request_queue的成 ...
- 使用TFS CI 又想保留服务运行状态的简单方法
最近公司使用TFS-CI的方式定期部署测试环境, 但是发现TFS-CI 运行完之后会清理agent所在的测试环境. 运行的进程都会被killed 1. 第一种方法: 本来第一反应 是使用systemd ...
- 京东金融APP-新交互技术“虚拟数字人”赋能世界杯主题营销
作者:平台研发部,智能服务与产品部 距离加文·伍德提出web3.0已经过去8年时间,这8年加文·伍德创建的以太坊大放异彩,同时由web3.0引出的数字人.元宇宙也生根发芽,茁壮成长,带来了非凡的用户体 ...
- vue组件上绑定原生事件
将原生事件绑定在组件上 .native 修饰符: 子组件 <template> <div class="demo"> <h2>我是子组件< ...
- RabbitMQ集成系统文章01---ABP VNext 分布式事务Event Bus 集成RabbitMQ
1.在两个应用中都配置好要连接的RabbitMQ "RabbitMQ": { "Connections": { "Default": { & ...
- TienChin-课程管理-添加课程页面
course.js 将 activity 替换成 course. index.vue 这个 index.vue 是 course 文件夹下面的 index.vue 别弄错了. <template ...
- 我手写了一个RPC框架。成功帮助读者斩获字节、阿里等大厂offer。
本着开源精神,本项目README已经同步了英文版本.另外,项目的源代码的注释大部分也修改为了英文. 如访问速度不佳,可放在 Gitee 地址:https://gitee.com/SnailClimb/ ...