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入门门槛低. 主 ...
随机推荐
- python3之lambda表达式
技术背景 lambda表达式本身是一个非常基础的python函数语法,其基本功能跟使用def所定义的python函数是一样的,只是lambda表达式基本在一行以内就完整的表达了整个函数的运算逻辑.这里 ...
- Laravel路由匹配
Route常规用法如下,特别是最后一个传参之后可以进行正则匹配,非常好用. //@后面内容为所要访问的方法 Route::get('foo', 'Photos\AdminController@meth ...
- 【特别的骚气】asp.net core运行时注入服务,实现类库热插拔
引言 很久之前在群里有看到说asp.net core能不能在运行时注入程序,当时并没有太在意,刚才在某个群里又看到有人再问,core能不能在运行时注入服务,闲来无事,我就研究了一下,其实也比较简单,在 ...
- [转帖]堆表(HOT)和索引组织表(IOT)优缺点
转载于: https://www.ywnds.com/?p=7702 一.堆表和索引组织表 NOTE 堆表也可以称之为 HOT,索引组织表也可以称之为 IOT,下面没有特别说明,两者都是一个意思. ...
- [转帖]浅析TiDB二阶段提交
https://cloud.tencent.com/developer/article/1608073 关键内容说明: TiDB 对于每个事务,会涉及改动的所有key中,选择出一个作为当前事务的Pri ...
- [转帖]jmeter线程组与循环次数的区别
在压测的时候,有些接口需要携带登录信息,但是我们只想登录一次,然后其他接口进行多用户压测,此时你会怎么办?用仅一次控制器实现吗?下面我们来看看用仅一次控制器能不能实现 压测时jmeter中的线程数是模 ...
- [转帖]使用Linux命令快速查看某一行
原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 当年,我还是Linux菜鸟的时候,就在简历上写着精通Linux命令了,而当面试官问我"如何快速查看 ...
- 行云部署成长之路--慢SQL优化之旅 | 京东云技术团队
当项目的SQL查询慢得像蜗牛爬行时,用户的耐心也在一点点被消耗,作为研发,我们可不想看到这样的事.这篇文章将结合行云部署项目的实践经验,带你走进SQL优化的奇妙世界,一起探索如何让那些龟速的查询飞 ...
- RN 表单TextInput的用法
你要注意安卓和苹果是不同的哈 有些属性是苹果才有的,有些是安卓独有的 有些两个都有哈 // 边框要设置两个属性哈 borderColor: 'pink', marginTop: 10, 具体看地址 h ...
- 学到了,原来 gzip 是种`连续分块`的压缩算法
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 我想要表述的是:假设有 10 mb的数据使用 gzip 算 ...