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函数可以使这种攻击难以实现。

什么是盐

  1. 密码加盐
  2. 本质就是增加要加密内容的单一性,使用复杂。比如:只对密码加密->对用户名和密码加密(一个不对全不对)->对用户名和密码再加随机数加密(为了验证,最终还是要报随机数的位置确定,验证前删除掉)

如何加盐

加盐示例代码

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();
}

加盐并能重复验证

  1. 一般一个系统会使用一个固定格式的盐 如用户名加密

  2. 也有使用固定位数的盐的,如把盐按一定规律插入到生面的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收集整理的更多相关文章

  1. php : 收集整理的非常有用的函数

    项目中经常会需要一些让人头疼的函数,作为开发者应该整理一个自己的函数库,在需要之时复制过来即可.以下是收集整理数十个PHP项目中常用的函数 1.PHP加密解密 PHP加密和解密函数可以用来加密一些有用 ...

  2. 收集整理的非常有用的PHP函数

    原文:收集整理的非常有用的PHP函数 项目中经常会需要一些让人头疼的函数,作为开发者应该整理一个自己的函数库,在需要之时复制过来即可.本文作者收集整理数十个PHP项目中常用的函数,保证能正常运行,你只 ...

  3. [转帖]PKI技术原理(收集 整理 归纳)

    PKI技术原理(收集 整理 归纳) https://blog.51cto.com/3layer/20430 总结归纳的 灰常好.. 7layer关注8人评论39427人阅读2007-03-14 11: ...

  4. 开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发

    [原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文  http: ...

  5. 最常用的PHP正则表达式收集整理

    最常用的PHP正则表达式收集整理 提交 我的评论 加载中 已评论 最常用的PHP正则表达式收集整理 2015-03-20 PHP100中文网 PHP100中文网 PHP100中文网 微信号 功能介绍 ...

  6. 【Android源代码下载】收集整理android界面UI效果源码

    在Android开发中,Android界面UI效果设计一直都是很多童鞋关注的问题,今天给大家分享下大神收集整理的多个android界面UI效果,都是源码,都是干货,贡献给各位网友! 话不多说,直接上效 ...

  7. 超常用的PHP正则表达式收集整理

    以下就是对超常用的PHP正则表达式进行的收集整理,为了方便大家更快更好的掌握php正则表达式. 一.表单验证匹配验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-z ...

  8. amoeba-mysql配置安装(收集整理)

    本文收集整理自: Amoeba搞定mysql主从读写分离 http://blog.chinaunix.net/uid-20639775-id-154600.html Amoeba非常好用的mysql集 ...

  9. 原生JS研究:学习jquery源码,收集整理常用JS函数

    原生JS研究:学习jquery源码,收集整理常用JS函数: 1. JS获取原生class(getElementsByClass) 转自:http://blog.csdn.net/kongjiea/ar ...

随机推荐

  1. SpringBootSecurity学习(01)网页版登录入门介绍

    Web应用安全管理 Web应用的安全管理,主要包括两个方面的内容,一个是用户身份的认证,即用户登录的设计,二是用户授权,即一个用户在一个应用系统中能够执行哪些操作的权限管理.权限管理的设计一般使用角色 ...

  2. layui table异步调用数据的时候,数据展示不出来现象解决方案

    最近使用layui table进行异步获取数据并填充的时候,控制台打印出数据长度为0,但是其中还有数据,网上找了很多办法,下边是我最后使用的. 一般,render渲染表格是独立的书写格式,但是我在做数 ...

  3. playframe 项目搭建

  4. eclipse与hadoop集成,运行wordCount1

    搭好了hadoop集群之后,就该使用它了 第一步:下载hadoop eclipse的插件,将它放到eclipse\plugins的目录下,然后重启eclipse,点击windows->show ...

  5. Angular 表单嵌套、动态表单

    说明: 组件使用了ng-zorro (https://ng.ant.design/docs/introduce/zh) 第一类:嵌套表单 1. 静态表单嵌套 demo.component.html & ...

  6. Hyperion: Building the Largest In memory Search Tree

    Introduction 索引在数据管理中起到很重要的作用,很多索引结构都会采用访问速度快而且内存消耗少的trie树,但一般常见的trie树索引结构都强调效率而忽视内存的效率,他们的效率虽然高,但内存 ...

  7. 基于bootstrap 在同一个界面弹出不同的模态框

    同一个页面如何操作多个模态框的弹出 <button class="btn btn-info" data-toggle="modal" data-targe ...

  8. 《构建之法》项目管理&典型用户和场景

    项目管理   PM的能力要求和任务: 1.观察.理解和快速学习能力 2.分析管理能力 3.一定的专业能力 4.自省的能力 在一个项目中,PM的具体任务: 1.带领团队形成团队的目标/远景,把抽象的目标 ...

  9. Flutter 错误捕获的正确姿势

    背景 我们知道,在软件开发过程中,错误和异常总是在所难免. 不管是客户端的逻辑错误导致的,还是服务器的数据问题导致的,只要出现了异常,我们都需要一个机制来通知我们去处理. 在 APP 的开发过程中,我 ...

  10. git远程分支不显示问题解决

    因为项目太大,然后直接git clone拉不下来代码 会报error: RPC failed; HTTP 504 curl 22 The requested URL returned error: 5 ...