什么是MD5?

MD5(Message Digest Algorithm 5,信息摘要算法5),是计算机广泛使用的摘要算法(又称哈希算法)之一。MD5是将一段信息,通过其不可逆的字符串变换算法,产生了唯一的MD5信息摘要(16位或32位固定长度的字符串)。即同一明文一定生成固定的密文。

为了防止用户登录密码泄露,数据库存储的密码不能是明文,即使数据库泄露了密码也不能直接泄露。通常的做法是将用户设置的登录密码进行MD5运算/加密后存入数据库。

当用户登录时,对用户输入的密码进行MD5运算,运算结果与数据库中的值进行比对,如果MD5密文一样,则认为用户登录密码正确,反之则认为密码错误。

以上是MD5最为普遍的使用方式

讲个小故事:

前段时间全国2600多只队伍、一万多人参加的网络安全比赛(各方大佬开心虐菜)。有一道赛题就是关于md5的web题,那道题一共三关,每一关都考验了md5值相等或者相同,最后一关是md5全等,听说需要md5碰撞产生两个相同的数值,而如果你想从一个md5值恢复到原来的值是非常困难的。

MD5加密是什么?

MD5加密使用的是hash算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),也就是一共有2^128种可能,大概是3.4*10^38,这个数字是有限多个的,而但是世界上可以被用来加密的原文则会有无数的可能性。

2009年,中国科学院的谢涛和冯登国仅用了220.96的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟。我使用过md5碰撞生成器,可以生成两个md5值相同但是内容不同的文件。

md5解密网站的原理

相信你在网上可以找到很多破解md5的网站,为什么能破解呢?是因为这些站点中存储了md5加密数据,通过查找数据库中对应的md5密文找到相对应的加密数据。

一个MD5密文理论上可能对应多个原文,通过遍历法可以暴力破解密码,但这是计算时间、计算资源的巨大消耗。

多次MD5加密

那么多次MD5加密能否提高密码的安全性呢?理论上肯定是安全一些,对暴力破解密码能起到一定的作用吧,毕竟盲破解是不管进行了几次MD加密的。

目前几乎所有常用的密码的一次md5、二次md5甚至3次md5的结果都被计算出来存到一个彩虹表里。当然你加密的次数越多肯定会越安全,不过呢最好的办法是在每一次md5加密之后你在密文后再加点数据,然后再进行md5加密,这样就不会被破解了。

下边介绍一下盐值加密,什么是盐值加密呢。就是通过生成随机数与MD5生成字符串进行组合,这样的随机性和不确定性就算是再怎么厉害的站长工具都解不开。

MD5盐值(随机盐值)加解密流程

MD5盐值加解密 工具类:

  1. import java.security.MessageDigest;
  2. import java.util.Random;
  3.  
  4. import org.apache.commons.codec.binary.Hex;
  5.  
  6. /**
  7. * MD5盐值加解密 工具类
  8. * @author sun
  9. * @date 2018年5月22日 上午11:18:00
  10. */
  11. public class PasswordUtil {
  12. /**
  13. * 生成含有随机盐的密码
  14. */
  15. public static String generate(String password) {
  16. Random r = new Random();
  17. StringBuilder sb = new StringBuilder(16);
  18. sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
  19. int len = sb.length();
  20. if (len < 16) {
  21. for (int i = 0; i < 16 - len; i++) {
  22. sb.append("0");
  23. }
  24. }
  25. String salt = sb.toString();
  26. password = md5Hex(password + salt);
  27. char[] cs = new char[48];
  28. for (int i = 0; i < 48; i += 3) {
  29. cs[i] = password.charAt(i / 3 * 2);
  30. char c = salt.charAt(i / 3);
  31. cs[i + 1] = c;
  32. cs[i + 2] = password.charAt(i / 3 * 2 + 1);
  33. }
  34. return new String(cs);
  35. }
  36.  
  37. /**
  38. * 校验密码是否正确
  39. */
  40. public static boolean verify(String password, String md5) {
  41. char[] cs1 = new char[32];
  42. char[] cs2 = new char[16];
  43. for (int i = 0; i < 48; i += 3) {
  44. cs1[i / 3 * 2] = md5.charAt(i);
  45. cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);
  46. cs2[i / 3] = md5.charAt(i + 1);
  47. }
  48. String salt = new String(cs2);
  49. return md5Hex(password + salt).equals(new String(cs1));
  50. }
  51.  
  52. /**
  53. * 获取十六进制字符串形式的MD5摘要
  54. */
  55. public static String md5Hex(String src) {
  56. try {
  57. MessageDigest md5 = MessageDigest.getInstance("MD5");
  58. byte[] bs = md5.digest(src.getBytes());
  59. return new String(new Hex().encode(bs));
  60. } catch (Exception e) {
  61. return null;
  62. }
  63. }
  64.  
  65. public static void main(String[] args) {
  66. String password = generate("111111");
  67. System.out.println(password);
  68. System.out.println(verify("111111", password));
  69. }
  70. }

固定盐值就是将上文中的salt换成固定串值。

总结:首先md5不是加密,其次加盐防的是彩虹表,加固定盐效果当然不如随机盐,但比没盐还是好得多!

git代码:https://github.com/dingsai88/StudyTest/tree/master/src/com/ding/util/md5

一个密码经过多次MD5加密能否提高安全性?Java MD5盐值加解密的更多相关文章

  1. jQuery的md5加密插件及其它js md5加密代码

    /** * jQuery MD5 hash algorithm function * * <code> * Calculate the md5 hash of a String * Str ...

  2. MD5+DES在C#.NET与Java/Android中的加解密使用

    一.背景后台(C#.NET)使用一个MD5+DES的加解密算法,查了下,很多网友都使用了这个算法.在Android里,也需要这个算法,如何把这个加解密算法切换成Java版,成了难题.毕竟好久没涉及到这 ...

  3. MD5加密之提取文件的MD5特征码

    public static String encodeFile(String path) { try { MessageDigest digester = MessageDigest.getInsta ...

  4. java加密工具类,可设置对应的加解密key

    public class AesEncryptUtil { //使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同! private static String KEY =& ...

  5. iOS MD5加密

    1.MD5加密 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321 ...

  6. 利用Java自带的MD5加密java.security.MessageDigest;

    MD5加密算法,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD2.MD3.MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著 ...

  7. android环境下两种md5加密方式

    在平时开发过程中,MD5加密是一个比较常用的算法,最常见的使用场景就是在帐号注册时,用户输入的密码经md5加密后,传输至服务器保存起来.虽然md5加密经常用,但是md5的加密原理我还真说不上来,对md ...

  8. Java实现对文本文件MD5加密并ftp传送到远程主机目录

    需求描述: 客户出完账之后需要把出账的数据以文本文件的方式传送给收入管理系统,客户以前是通过本地的一个工具软件上传的,由于安全监管的原因,不允许在本地使用工具上传,因此客户希望我们在已经上线使用的系统 ...

  9. iOS中MD5加密字符串实现

    1.MD5加密 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321 ...

随机推荐

  1. Linux - 加密打包

    tar 加密打包 压缩 tar -czvf /path/to/file.tar.gz file 解压 tar -xzvf /path/to/file.tar.gz /path/to 加密压缩 tar ...

  2. 算法试题 - 找出最小 k 个数

    题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k), ...

  3. MyBatis Mapper Demo

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...

  4. 转:Zepto的使用以及注意事项

    为什么选择Zepto.js的原因: zepto.js的语法借鉴并且兼容jQuery,会使用jquery就会使用Zepto.js.Zepto.js是移动端的js库.Zepto.js相当于PC端的jQue ...

  5. Monkeyrunner 使用说明

    monkeyrunner为android系统新公开的一个测试工具.有助于开发人员通过脚本部署较大规模的自动化测试. Monkeyrunner       本文档中包含 一个简单的monkeyrunne ...

  6. strip使用

    strip作用:去掉空格.以及想要去掉的字符,实例如下: In [42]: import subprocess In [42]: output=subprocess.check_output([&qu ...

  7. shutil使用

    1.用shutil移动文件, import shutil shutil.move('/root/test.yaml','/home/') shutil.move('/root/k8s.py','/ho ...

  8. 非线性函数图像表示(GLSL)

    说明:绘图区域x轴(0->1),y轴(0->1); 1.y = 0.5 + sqrt(x * (1 - x)) 2.y = smoothstep(a , b , x) y = smooth ...

  9. golang struct结构体初始化的几种方式

    type User struct { Id int `json:"id" orm:"auto"` // 用户名 Username string `json:&q ...

  10. UOJ#548.数学

    #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> #inc ...