理论上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. eas之日期选择控件

    初始化打印控件KDPrinter ctrlPrinter = new KDPrinter(); 增加列 // 指定插入位置table.addColumn(index);// 插入到最后table.ad ...

  2. 获取url

    首先要知道Location这个对象以及这个对象中的一些属性: href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主 ...

  3. SDWC2017游记

    果然我还是那么弱啊.——$Mingqi_H.$ Day -1 下午五点半回家.然而并没有什么事情可做.依旧是下载$Magical\,Mirai$,找一个黄油存起来. emmm...本来是打算去开发区那 ...

  4. [jzoj 5776]【NOIP2008模拟】小x游世界树 (树形dp)

    传送门 Description 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当他想前往阿瓦隆时发现那里只有圣诞节时才能到达 ...

  5. Xcache3.2.0不支持php7.0.11

    编译安装xcache3.2.0时在make这一步报错: AUTOCHECK missing : "arg_flags" "cache_size" AUTOCHE ...

  6. Git 基础教程 之 版本回退

    不断对文件进行修改,然后不断提交修改到版本库里. 当你觉得文件修改到一定程度时,可以保存一个“快照”,这个“快照”在Git中称为“commit”. 一旦文件被改乱了.误删了,都可以从最近一个“comm ...

  7. 使用Layer完成图片放大功能

    序言:在写这个功能之前也用了zoom.js,zoom.js用起来简单引用js然后设置图片属性就可以放大.但是放大后的图片模糊.没有遮罩.在放大图片时其它图片布局会受到影响,当然如果觉得这些都是小问题的 ...

  8. 手写DAO框架(四)-SQL执行

    -------前篇:手写DAO框架(三)-数据库连接--------- 前言 通过上一篇写的方法,可以灵活的获取.释放数据库连接,拿到连接之后,我们就可以执行sql了!所以,本篇介绍的就是SQL执行器 ...

  9. Docker 搭建 ELK 读取微服务项目的日志文件

    思路: 在docker搭建elasticsearch与kibana来展示日志,在微服务部署的机子上部署logstash来收集日志传到elasticsearch中,通过kibana来展示,logstas ...

  10. 图论·Floyd算法·HDU2544&1874 (伪)2066

    在看到1874的题时,第一反应是用上一篇的并查集方法,后来查了一下是要用Floyd做,所以就去查Floyd算法的资料. 即插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法. 核心代码:  ma ...