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入门门槛低. 主 ...
随机推荐
- Python追踪内存占用
技术背景 当我们需要对python代码所占用的内存进行管理时,首先就需要有一个工具可以对当前的内存占用情况进行一个追踪.虽然在Top界面或者一些异步的工具中也能够看到实时的内存变化,还有一些工具可以统 ...
- AMBA总线介绍-01
AMBA总线介绍 AMBA总线概述 AHB APB 不同IP之间的互连 1.系统总线简介 系统芯片中各个模块之间需要有接口连接,使用总线作为子系统之间共享的通信链路 优点:成本低,方便易用(通用协议, ...
- 【MMC子系统】 二、EMMC协议
[MMC子系统] 二.EMMC协议 1.前言 在上一节,我们知道EMMC.SD.SDIO三种规范都是在MMC规范之上发展而来,协议相差不大,所以Linux Kernel才能使用MMC子系统来统一管理! ...
- 【RTOS】基于RTOS的降低功耗的策略
RTOS中降低功耗的策略 Saving Power with an RTOS 介绍 随着绿色节能产品需求的增加,快速增长的移动设备,其电池寿命最受关注,设计者必须要考虑在其设计中如何最大限度的降低功耗 ...
- [转帖]十分钟掌握 Vim 编辑器核心功能
https://juejin.cn/post/6929248764746006535 前言 相信不论是前端还是后台多多少少都需要上到服务器上做一些操作,改改配置文件等,大多数 Linux 服务器默认都 ...
- [转帖]TiDB修改配置参数
https://www.jianshu.com/p/2ecdb4642579 在TiDB 中,"修改配置参数"似乎是个不精准的说法,它实际包含了以下内容: 修改 TiDB 的系统变 ...
- [转帖]TiKV读写流程浅析
https://www.cnblogs.com/luohaixian/p/15227838.html 1.TiKV框架图和模块说明 图1 TiKV整体架构图 1.1.各模块说明 PD Cluster ...
- [转帖]grafana配置邮件发送
grafana的邮件配置文件是/etc/grafana/grafana.ini,新建grafana.ini文件,内容如下. chown 472:472 grafana.ini ############ ...
- [转帖]PostgreSQL 日志参数解释 常用环境日志参数配置
1.常用日志参数 logging_collector = on/off 是否将日志重定向至文件中,默认是off(该配置修改后,需要重启DB服务),启动之后查看进程ps -ef|grep postgr ...
- IIS 实现autoindex的简单方法 能够下载文件等.
之前使用nginx 的autoindex on 的参数 能够实现了 nginx的 目录浏览查看文件 但是那是linux上面的 windows 上面很多 使用的 其实是 iis的居多 然后看了下 其实也 ...