博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个密码经过多次MD5加密能否提高安全性?Java MD5盐值加解密
阅读量:5124 次
发布时间:2019-06-13

本文共 3477 字,大约阅读时间需要 11 分钟。

 

什么是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:0010  */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

 

 

转载于:https://www.cnblogs.com/Jeremy2001/p/10945000.html

你可能感兴趣的文章
Buffers, windows, and tabs
查看>>
No module named 'urllib2'
查看>>
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机
查看>>
hdu.1254.推箱子(bfs + 优先队列)
查看>>
6.0动态加载权限用PermissionGen
查看>>
Android学习笔记之Bitmap位图虽触摸点移动
查看>>
Careercup - Microsoft面试题 - 5428361417457664
查看>>
Akka(19): Stream:组合数据流,组合共用-Graph modular composition
查看>>
前端基础_认识前端.md
查看>>
【02】koala编译中文出错(已放弃不用)
查看>>
【LintCode题集】Q6、Q64
查看>>
sql server 2008学习3 表组织和索引组织
查看>>
动态规划
查看>>
4.15
查看>>
微信小程序—day01
查看>>
LeetCode-Scramble String
查看>>
阿里云服务器由于被检测到对外攻击,已阻断该服务器对其它服务器端口的访问...
查看>>
IT英语2-编程词汇编程英语词汇
查看>>
angularjs中的分页指令
查看>>
jQuery.validate.js API
查看>>