MD5收集整理
MD5如何生成的
生成MD5
1.通过摘要生成MD5
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(input.getBytes(StandardCharsets.UTF_8));
byte[] hashBytes = md.digest();
StringBuilder sb = new StringBuilder();
for (byte b : hashBytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
2.使用Google的Guava生成MD5
- 添加依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.1-jre</version>
</dependency>
- 生成代码
// com.google.common.hash.Hashing.md5()
// If you must interoperate with a system that requires MD5, then use this method, despite its deprecation. But if you can choose your hash function, avoid MD5, which is neither fast nor secure. As of January 2017, we suggest:
// For security: Hashing.sha256() or a higher-level API.
// For speed: Hashing.goodFastHash(int), though see its docs for caveats.
HashFunction hashFunction = Hashing.md5();
HashCode hash = hashFunction.hashString(input, StandardCharsets.UTF_8);
return hash.toString();
3.使用Appach的commons生成MD5
- 添加依赖
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>
- 生成代码
String md5 = DigestUtils.md5Hex( input );
return md5;
加盐MD5
为什么加盐
彩虹表是一个用于加密散列函数逆运算的预先计算好的表, 常用于破解加密过的密码散列。一般主流的彩虹表都在100G以上。 查找表常常用于包含有限字符固定长度纯文本密码的加密。这是以空间换时间的典型实践, 在每一次尝试都计算的暴力破解中使用更少的计算能力和更多的储存空间,但却比简单的每个输入一条散列的翻查表使用更少的储存空间和更多的计算性能。使用加盐的KDF函数可以使这种攻击难以实现。
什么是盐
- 密码加盐
- 本质就是增加要加密内容的单一性,使用复杂。比如:只对密码加密->对用户名和密码加密(一个不对全不对)->对用户名和密码再加随机数加密(为了验证,最终还是要报随机数的位置确定,验证前删除掉)
如何加盐
加盐示例代码
public static String createMd5WithSalt(String input) throws NoSuchAlgorithmException {
// MessageDigest instance for MD5
MessageDigest md = MessageDigest.getInstance("MD5");
// Generate the random salt
SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);
md.update(salt);
md.update(input.getBytes(StandardCharsets.UTF_8));
byte[] hashBytes = md.digest();
StringBuilder sb = new StringBuilder();
for (byte b : hashBytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
加盐并能重复验证
一般一个系统会使用一个固定格式的盐 如用户名加密
也有使用固定位数的盐的,如把盐按一定规律插入到生面的md5中,验证时从中取出盐,然后再校验
private static Integer SALT_LENGTH = 16;
private static Integer SALT_MD5_LENGTH = 48;
private static Integer STEP_LENGTH = 3;
public static String createMd5WithSalt(String input) throws NoSuchAlgorithmException {
// 生成一个16位的随机数
SecureRandom random = new SecureRandom();
StringBuilder sBuilder = new StringBuilder(16);
sBuilder.append(random.nextInt(66888888)).append(random.nextInt(66888888));
int len = sBuilder.length();
if (len < SALT_LENGTH) {
for (int i = 0; i < SALT_LENGTH - len; i++) {
sBuilder.append("0");
}
}
// 生成最终的加密盐
String Salt = sBuilder.toString();
String saltMd5 = createMd5(input + Salt);
char[] cs = new char[SALT_MD5_LENGTH];
for (int i = 0; i < SALT_MD5_LENGTH; i += STEP_LENGTH) {
cs[i] = saltMd5.charAt(i / 3 * 2);
char c = Salt.charAt(i / 3);
cs[i + 1] = c;
cs[i + 2] = saltMd5.charAt(i / 3 * 2 + 1);
}
return String.valueOf(cs);
}
public static boolean verifyMd5WithSalt(String input, String md5str) throws NoSuchAlgorithmException {
char[] cs1 = new char[32];
char[] cs2 = new char[16];
for (int i = 0; i < SALT_MD5_LENGTH; i += STEP_LENGTH) {
cs1[i / 3 * 2] = md5str.charAt(i);
cs1[i / 3 * 2 + 1] = md5str.charAt(i + 2);
cs2[i / 3] = md5str.charAt(i + 1);
}
String Salt = new String(cs2);
return createMd5(input + Salt).equals(String.valueOf(cs1));
}
// 使用
// 加盐
String md5WithSalt = MessageDigestCreate.createMd5WithSalt("测试md5");
System.out.println(md5WithSalt);
System.out.println(MessageDigestCreate.verifyMd5WithSalt("测试md5",md5WithSalt));
/**
125214383c3b755320902731b46d79344914f2199c786272
true
*/
- 建议使用安全随机数。
- 其它几种方式加盐同理,只是生面md5的来源不同
- 源码
MD5收集整理的更多相关文章
- php : 收集整理的非常有用的函数
项目中经常会需要一些让人头疼的函数,作为开发者应该整理一个自己的函数库,在需要之时复制过来即可.以下是收集整理数十个PHP项目中常用的函数 1.PHP加密解密 PHP加密和解密函数可以用来加密一些有用 ...
- 收集整理的非常有用的PHP函数
原文:收集整理的非常有用的PHP函数 项目中经常会需要一些让人头疼的函数,作为开发者应该整理一个自己的函数库,在需要之时复制过来即可.本文作者收集整理数十个PHP项目中常用的函数,保证能正常运行,你只 ...
- [转帖]PKI技术原理(收集 整理 归纳)
PKI技术原理(收集 整理 归纳) https://blog.51cto.com/3layer/20430 总结归纳的 灰常好.. 7layer关注8人评论39427人阅读2007-03-14 11: ...
- 开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发
[原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文 http: ...
- 最常用的PHP正则表达式收集整理
最常用的PHP正则表达式收集整理 提交 我的评论 加载中 已评论 最常用的PHP正则表达式收集整理 2015-03-20 PHP100中文网 PHP100中文网 PHP100中文网 微信号 功能介绍 ...
- 【Android源代码下载】收集整理android界面UI效果源码
在Android开发中,Android界面UI效果设计一直都是很多童鞋关注的问题,今天给大家分享下大神收集整理的多个android界面UI效果,都是源码,都是干货,贡献给各位网友! 话不多说,直接上效 ...
- 超常用的PHP正则表达式收集整理
以下就是对超常用的PHP正则表达式进行的收集整理,为了方便大家更快更好的掌握php正则表达式. 一.表单验证匹配验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-z ...
- amoeba-mysql配置安装(收集整理)
本文收集整理自: Amoeba搞定mysql主从读写分离 http://blog.chinaunix.net/uid-20639775-id-154600.html Amoeba非常好用的mysql集 ...
- 原生JS研究:学习jquery源码,收集整理常用JS函数
原生JS研究:学习jquery源码,收集整理常用JS函数: 1. JS获取原生class(getElementsByClass) 转自:http://blog.csdn.net/kongjiea/ar ...
随机推荐
- [Linux] Telnet提示:Unable to connect to remote host: No route to host
出错现象: [root@localhost ~]# telnet 192.168.1.128 Trying 192.168.1.128...telnet: connect to address 192 ...
- Codeforces Numbers 题解
这题只需要会10转P进制就行了. PS:答案需要约分,可以直接用c++自带函数__gcd(x,y). 洛谷网址 Codeforces网址 Code(C++): #include<bits/std ...
- MyEclipse 中无法直接使用BaseEncoder问题
首先 :点击项目---->build path--->configure Build Path 然后:java build path --->libraries--->JRE ...
- 夯实Java基础系列7:一文读懂Java 代码块和执行顺序
目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块 ...
- 算法与数据结构基础 - 深度优先搜索(DFS)
DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...
- Hadoop点滴-何时使用hadoop fs、hadoop dfs与hdfs dfs命令
何时使用hadoop fs.hadoop dfs与hdfs dfs命令 编辑 删除 hadoop fs:使用面最广,可以操作任何文件系统. hadoop dfs与hdfs dfs:只能操作HDFS文件 ...
- CVPR 2019 论文解读 | 小样本域适应的目标检测
引文 最近笔者也在寻找目标检测的其他方向,一般可以继续挖掘的方向是从目标检测的数据入手,困难样本的目标检测,如检测物体被遮挡,极小人脸检测,亦或者数据样本不足的算法.这里笔者介绍一篇小样本(few ...
- linux下安装Elasticsearch
一.简单介绍: Elasticsearch提供了近乎实时的数据操作和搜索功能,es集群中所有节点可以一起提供索引和搜索功能,能够相互发现彼此和自动地加入到集群中 二.基础概念: 1.索引: 表征的文档 ...
- 手把手教你如何在window下将jenkins+allure集成生成的测试报告通过jenkins配置邮箱自动发送-04(非常详细,非常实用)
简介 上一篇生成测试报告,小伙伴们和童鞋们就又问道,测试报告已经生成了,怎么发送给相关的负责人了?小伙伴们和童鞋们不要着急,听宏哥慢慢给你道来,心急吃不了热豆腐哈.今天这篇文章宏哥就给小伙伴和童鞋们来 ...
- css3:bacground-size
个人博客: https://chenjiahao.xyz CSS3之背景尺寸Background-size是CSS3中新加的一个有关背景的属性,这个属性是改变背景尺寸的通过各种不同是属性值改变背景尺寸 ...