理论上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之指定虚模式

    KDTable支持三种取数模式:实模式.虚模式分页.虚模式分组,默认为实模式.// 实模式table.getDataRequestManager().setDataRequestMode(KDTDat ...

  2. js对比for、forEach、map遍历数组速度

    function a() { var arr = new Array(1000000); for(var i = 0; i < arr.length;i ++) { arr[i] = i; } ...

  3. Java8自定义条件让集合分组

    /** * 将一个指定类型对象的集合按照自定义的一个操作分组: 每组对应一个List.最终返回结果类型是:List<List<T>> * * @param <T> ...

  4. Linux—Ubuntu14.0.5 修改gitlab管理员的密码

    1. 在root用户下,执行 gitlab-rails console production #进入gitlba控制台 2.获得用户数据,修改用户密码 [root@svr34 bin]# gitlab ...

  5. vue 2.0 + elementUI 实现面包屑导航栏

    Main.js 9种响应式面包屑导航和分步导航指示器UI设计 var routeList = []; router.beforeEach((to, from, next) => { var in ...

  6. 10.使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)

    出处:http://www.cnblogs.com/lichenwei/p/4145696.html Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由 ...

  7. GOF23设计模式之适配器模式

    GOF23设计模式之适配器模式 结构型模式: 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类:适配器模式.代理模式.桥接模式.装饰模式.组合模式.外观模式. ...

  8. 0320SQL中的where条件,在数据库中提取与应用浅析

    转自 何登成的技术博客 追求技术的道路上,10年如一日     首页 关于我 RSS 订阅 © 2012-2017 何登成的技术博客   SQL中的where条件,在数据库中提取与应用浅析 3月 3r ...

  9. django orm多条件查询及except处理不存在记录的样码

    日常所用的功能, 记录下来加深记忆. try: sv_set = Sv.objects.get(project=site_name, version=deploy_version) print sv_ ...

  10. 关于TRIANGLE二维三角网格生成器在windows下的配置说明

    近期须要用到三角网格生成的一些东西,所以就把TRIANGLE这个库编译了一下,发现编译过程还是略微有些纠结,于是就想到写下来.希望以后有些童鞋看到少走一些弯路. 首先很感谢eryar的帮助,很感谢! ...