直接上代码:该代码可以直接用于项目中做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加密算法实现原理的更多相关文章

  1. 浅谈Shiro框架中的加密算法,以及校验

    在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.为什么要加密:网络安全问题是一个很大的隐患,用户数据泄露事件层出不穷,比如12306账号泄露. Shiro提供了base64和1 ...

  2. Shiro框架 (原理分析与简单实现)

    Shiro框架(原理分析与简单实现) 有兴趣的同学也可以阅读我之前分享的:Java权限管理(授权与认证)CRM权限管理   (PS : 这篇博客里面的实现方式没有使用框架,完全是手写的授权与认证,可以 ...

  3. MD5加密算法原理及其应用

    MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆:所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后 ...

  4. shiro框架总结

    一.概念 shiro是一个安全框架,主要可以帮助我们解决程序开发中认证和授权的问题.基于拦截器做的权限系统,权限控制的粒度有限,为了方便各种各样的常用的权限管理需求的实现,,我们有必要使用比较好的安全 ...

  5. 一起谈谈MD5加密算法

    MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆:所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后 ...

  6. MD5加密算法测试

    在用户注册这一块,密码加密保证客户信息安全是最重要的,在网上查询了一些资料,发现加密算法比较流行的有MD5,DES和SHA. 虽然SHA与MD5通过碰撞法被破解了,但是MD5和SHA仍被公认是安全的加 ...

  7. JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作

    1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...

  8. MD5加密算法的Java版本

    网上搜索Java实现MD5的资料很多,错误的也很多. 之前编写的一个阿里云直播鉴权原理算法需要用到MD5算法,网上找了几个,都是不行,浪费了时间,现在贴一个,做备用. import java.secu ...

  9. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十一):集成 Shiro 框架

    Apache Shiro 优势特点 它是一个功能强大.灵活的,优秀开源的安全框架. 它可以处理身份验证.授权.企业会话管理和加密. 它易于使用和理解,相比Spring Security入门门槛低. 主 ...

  10. Spring Boot + Spring Cloud 实现权限管理系统 (集成 Shiro 框架)

    Apache Shiro 优势特点 它是一个功能强大.灵活的,优秀开源的安全框架. 它可以处理身份验证.授权.企业会话管理和加密. 它易于使用和理解,相比Spring Security入门门槛低. 主 ...

随机推荐

  1. 07-逻辑仿真工具VCS-Post processing with VCD+ files

    逻辑仿真工具-VCS 编译完成不会产生波形,仿真完成之后,生成波形文件,通过dve产看波形 vcd是波形文件的格式,但是所占的内存比较大,后面出现了vpd(VCD+)波形文件 将一些系统函数嵌入到源代 ...

  2. 【BUS】LIN Bus

    概述 随着汽车内电子设备的增多,市场上对于成本低于 CAN 的总线的需求日益强烈,不同的车厂相继开发各自的串行通信(UART/SCI)协议,以在低速和对性能要求不高的场合取代CAN.由于不同车厂定义的 ...

  3. Redis-键

  4. [转帖]TiKV Control 使用说明

    https://docs.pingcap.com/zh/tidb/stable/tikv-control TiKV Control(以下简称 tikv-ctl)是 TiKV 的命令行工具,用于管理 T ...

  5. [转帖]比快更快的 ELK 8 安装使用指南-Elasticsearch,Kibana,Logstash

    https://juejin.cn/post/7133907643386560519 携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情 Elastic 8 ...

  6. [转帖]ubuntu开启sar记录日志

    https://www.cnblogs.com/ishmaelwanglin/p/16955227.html 背景 之前一直用CentOS系统,最近换到了ubuntu的,sar日志对分析系统状态和基本 ...

  7. [转帖]Innodb存储引擎-idb文件格式解析

    文章目录 ibd 文件格式解析 idb文件 page类型和格式(File Header & Trailer) FIL_PAGE_TYPE_FSP_HDR 格式 Extent Descripto ...

  8. [转帖]linux 查看CPU 内存的信息

    https://bbs.huaweicloud.com/blogs/302929   [摘要] ECS信息规格:2vCPUs | 4GiB | kc1.large.2镜像:openEuler 20.0 ...

  9. Nginx调优总结-第六部分编译优化与简单测试

    第六部分 编译优化 Nginx可以自行编译,所以里面可以设置多个编译策略. 也可以自行修改源码,便于比如进行ip_hash的全IP地址验证. 也可以修改nginx的版本号等信息, 避免内发现. 还可以 ...

  10. SAP PO7.5 有关https 接口body编码格式 application/x-www-form-urlencoded

    近期项目中,在PO中做接口 遇到OAUTH2.0认证方式,token获取过程中编码格式为 "application/x-www-form-urlencoded" 实现过程错误记录: ...