直接上代码:该代码可以直接用于项目中做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. Python-函数-算术函数

    #python-函数-算术函数 #(1)加减乘除 #加法 add(),减法 subtract(),乘法 multiply(),除法 divide() #作用:数组间的加减乘除 import numpy ...

  2. Android生成SHA1(证书指纹)

    去到jdk所在目录 C:\Program Files (x86)\Java\jdk1.8.0_73\bin 输入命令: keytool -list -v -keystore mykey.keystor ...

  3. ONVIF网络摄像头(IPC)客户端开发—ONVIF介绍

    ​ 1.前言: 网上已经有很多关于ONVIF开发的资料,这里概括介绍一下ONVIF协议以及介绍一下我自己在开发ONVIF网络摄像头的一些流程和经验,做个开发记录和经验总结,以备将来查看,也可供他人参考 ...

  4. 阿里云龙蜥8.6部署SQLSERVER2022的过程

    阿里云龙蜥8.6部署SQLSERVER2022的过程 背景 之前总结过, 但是发现当时是preview版本. 这里想升级一下, 并且顺便抄一下他的部分说明 下载 wget https://packag ...

  5. [转帖]一文读懂 HugePages(大内存页)的原理

    https://juejin.cn/post/6956541214426398757 在介绍 HugePages 之前,我们先来回顾一下 Linux 下 虚拟内存 与 物理内存 之间的关系. 物理内存 ...

  6. [转帖]【JVM】JDK命令行工具

    在JDK/bin目录下我发现了许多命令行工具 这些命令有哪些作用呢,接下来我就来详细介绍一下 常用JDK命令行工具 命令名称 全称 用途 jstat JVM Statistics Monitoring ...

  7. CS231N Assignment1 softmax 笔记

    -为Softmax分类器实现完全矢量化的损失函数 -实现解析梯度完全矢量化的表达式 使用数值梯度检查实现结果 使用验证集调整学习率和正则化强度 使用SGD优化损失函数 可视化最终学习的权重 softm ...

  8. NOI2023 游记

    不完全按时间顺序写.记录 NOI 的一些琐事. 从 XDFZ 坐大巴 5 个小时来到成七.第一眼看到的是一个放着 NOI 牌子的台阶,还有一个签名墙.好像在我们之前到的人不太多? 用中英双语签名(冷月 ...

  9. vue/cli的配置详解

    查看vue/cli的配置 vue的脚手架隐藏了所有的webpack相关的配置,若是想要查看webpack的配置 你可以去执行 vue inspect > output.js 这样就可以查看它的配 ...

  10. 新建立git分支,之后将分支合并到master上

    1.打开PowerShell 进入解决方案中的文件夹中,并列出目前远程的所有分支 命令:git branch -a 2.从远程获取最新版本到本地 命令:git fetch --all 3.使本地代码与 ...