理论上md5是不可逆的,而且MD5本来也不是作加密使用,而是用来校验数据的完整性,只是因为其不可逆且稳定、快速的特点,被广泛用于对明文密码的加密。

至今仍然后很多开发人员相信MD5的保密性,也许因为他们知道MD5的算法,觉得hash不可逆。但实际上,真正要破解MD5的人,不会选择逆向逆的明文,都是用hash碰撞。把一些明文密码MD5 hash一遍之后对比哪个MD5值与你的一样。那你的明文就知道了。类似于一个比对词典,叫做彩虹表。

举个例子比如一个密码是‘88888888’那么任何采用标准MD5加密的网站数据库中,存放的都是8ddcff3a80f4189ca1c9d4d902c3c909这样一个MD5值。

由于密文相同,大多数网站和系统的加密都是以相同的明文口令生成相同的密文。所以,那些高频的密文就是高频明文的口令。攻击者可以针对标准算法来制定高频明文的对应密文文档来查询比对。通过穷举的方式制定数字字母组合的口令与多种算法加密结果的映射结果集,就形成了彩虹表。

加盐

哈希加盐法(HASH+SALT)。所谓加盐(SALT)其实就是生成HASH时给予一个干扰,使结果与标准的HASH结果不同,从而对抗彩虹表。
比如说用户密码‘88888888’,加一个盐(一个随机字符串)‘q1we2rt3y6u8io7p’,拼接到一起在计算MD5,结果值就变了。这样即使用户使用弱密码,也能一定程度上防御彩虹攻击。但是如果每个密码加的盐都是一样的,那么就又回到了之前的问题了。
一人一密

我们要实现,相同的站点,不同用户的相同的密码口令不同。这样就能有效的对付碰撞和统计攻击。例如:加自定义的盐。密码拼接用户名或者时间戳在计算MD5。

用户注册时:
1.用户输入[username]和[password]
2.系统为用户生成[Salt值]
3.系统将[Salt值]和[password]拼接在一起
4.对拼接后的值进行散列,得到[Hash1]
5.将[Hash1]和[Salt值]放在数据库中。

用户登录时:
1.用户输入[username]和[password]
2.系统通过用户名找到与之对应的[Hash1]和[Salt值]
3.系统将[Salt值]和[用户输入的密码]拼接在一起
4.对拼接后的值进行散列,得到[Hash2]
5.对比[Hash1]和[Hash2]是否相等,相等则授权登录

MD5加盐,实现一人一密的更多相关文章

  1. md5加密,md5加盐加密和解密

    package com.java.test; import java.security.MessageDigest; import java.security.SecureRandom; import ...

  2. Java使用MD5加盐进行加密

    Java使用MD5加盐进行加密    我使用的方法是导入了md5.jar包,就不需要再自己写MD5的加密算法了,直接调用方法即可 点击下载md5包 import com.ndktools.javamd ...

  3. 一种简单的md5加盐加密的方法(防止彩虹表撞库)

    md5加密(或者说摘要算法)大家都很熟悉了 就不解释了 现在很多数据库设计都喜欢用单向加密的方式保存密码,验证时对提交的密码再次加密之后做密文对比 /// <summary> 使用MD5加 ...

  4. MD5 加盐(Java)

    本文转载自:https://blog.csdn.net/dingsai88/article/details/51637977 jar:https://pan.baidu.com/s/1-8JaRoUt ...

  5. MD5加盐加密

    package com.chauvet.utils; import java.security.NoSuchAlgorithmException; import java.util.Random; / ...

  6. 用户角色权限查询添加bug集锦 用户密码加密 MD5 加盐 随机盐 spring的加密bcrypt

    package cn.itcast.encode; import org.apache.commons.lang3.RandomStringUtils; import org.springframew ...

  7. MD5 加盐加密

    一.概述 MD5(Message Digest  Algorithm 5),是一种散列算法,是不可逆的,即通过md5加密之后没办法得到原文,没有解密算法. 在一般的项目中都会有登录注册功能,最简单的, ...

  8. MD5加盐与安全

    PHP开发者对md5()这个函数是熟悉不过了,很多开发者都使用md5('abc123')对用户密码进行加密处理,这样做没有错,但是安全性还是很低的,因为很多网站的用户数据都是用md5进行加密处理的,所 ...

  9. 关于MD5加盐使用

    md5 是一种数据加密,例子是对123456 进行了两次加盐 第一次是 inputPassToFormPass   salt是固定的 1a2b3c4d 第二次是  formPassToDBPass s ...

随机推荐

  1. nyoj112-指数运算

    指数运算时间限制:600 ms  |  内存限制:65535 KB难度:2描述写一个程序实现指数运算 X^N.(1<X<10,0<N<20)输入输入包含多行数据 每行数据是两个 ...

  2. JAVA数据库连接的另一种实现及简单的数据插入及显示

    教材是JDK8的,家里也可以正规的测试JDK8, 但公司电脑是JDK6的,所以代码要相应的变动一下下,以适应老的TRY语句. Message.java package cc.openhome; imp ...

  3. RestTemplate使用详解

    1.RestTemplate添加RequestHeader如content-type可通过httpclient设置 List<Header> headers = new ArrayList ...

  4. hdoj 1257最少拦截系统

     /*最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  5. OSX: 安装打印机的有用命令行

    事实上非常easy.就是有用lpadmin命令,以下给出一个样例: printername="YOUR_PRINTER_NAME" location="LOCATION ...

  6. iOS UIToolBar的使用

    UIToolBar存在于UINavigationController导航栏控制器中.并且默认被隐藏. 当设置UIToolBar显示,或者存在UITabBarController且tabbar被隐藏的时 ...

  7. Storm工作流程 vs. Spark Stream

    看的这个学习课程: http://study.163.com/course/courseLearn.htm?courseId=1002887002#/learn/video?lessonId=1003 ...

  8. C++二叉树笔试题

    #include <iostream> #include <stack> #include <queue> using namespace std; templat ...

  9. 3D语音天气球(源代码分享)——通过天气服务动态创建3D球

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...

  10. Web端即时通讯、消息推送的实现

    https://blog.csdn.net/DeepLies/article/details/77726823