理论上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之利用KDTableHelper批量填充数据

    // 下述代码将创建一个KDTable,并指定列名.表头单元格的显示值.和表体数据KDTable table = new KDTable();String [] columnKeys = new St ...

  2. 【剑指Offer】14、链表中倒数第k个结点

      题目描述:   输入一个链表,输出该链表中倒数第k个结点.为了符合习惯,从1开始计数,即链表的尾结点是倒数第1个节点.例如,一个链表有6个结点,从头结点开始,它们的值依次是1,2,3,4,5,6. ...

  3. [基准测试]----lmbench

    引言 要评价一个系统的性能,通常有不同的指标,相应的会有不同的测试方法和测试工具,一般来说为了确保测试结果的公平和权威性,会选用比较成熟的商业测试软件.但在特定情形下,只是想要简单比较不同系统或比较一 ...

  4. swift-教你如何实现导航上的UISearchController动画效果。

    这个代码片段是我这周我从网上找了各种资料然后经过自己的修改终于弄好了导航的上下动画效果: step1:==>因为这个搜索要有动画效果,所以这个页面必须要有一个导航控制器: //1.自定义创建导航 ...

  5. salt 根据ip修改主机名

    首先定义pillar [root@web1 pillar]# cat hostname.sls ip_hostname: 10.1.1.1: web1 10.1.1.2: web2 10.1.1.3: ...

  6. SIGPROF和SIGALRM使用总结

    这几天,被公司的两个模块的程序好好的搞了一下,开始以为是SHELL的问题,仔细研究了以下,原来没有想象的那么复杂!!!       关键在使用的信号SIGALRM 上,两个进程都用可SIGALRM 信 ...

  7. 在java中,怎样跳出当前的多重循环?

    </pre>直接用break ;详细举比例如以下:<p></p><p></p><p></p><pre name ...

  8. Cloud Card是否能干掉App

    算下来有一年没写blog了.这一年算是潜心做一件事情,随着云OS 3.0已公布.总算能够向外界表达了我们想做个啥,非常多人也開始质疑,Cloud Card究竟是个啥?云OS 3.0算不算自主研发的OS ...

  9. bzoj3931【CQOI2015】网络吞吐量

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 853  Solved: 381 [Submit][id= ...

  10. SQL SERVER读书笔记:nolock

    让查询语句不去申请共享锁,从而消除死锁,效果立竿见影. 缺点: 1.脏读 2.只能解决共享锁(S锁)参与的问题 3.需要修改语句本身才能使用