常用的对称加密算法有:DES、3DES、RC2、RC4、AES

常用的非对称加密算法有:RSA、DSA、ECC

使用单向散列函数的加密算法(摘要算法):MD5、SHA

  那么什么是salt?生成一个随机数,我们称之为salt,然后在数据库中记录salt和h=hash(pwd + salt),查询的时候,得到用户的口令p,然后从数据库中查出salt,计算hash(p+salt),看是不是等于h,等于就是对的,不等于就是不对的。
  单纯使用MD5之所以不好,并不是说MD5这种方法容易遭到破解,而事实上对于MD5求原象或者第二原象,也就是“逆计算”这种破解,没有什么很好的方法。只能通过预先计算知道许多MD5的对应关系,存在数据库中,然后使用的时候反查,例如我知道'password'的MD5值是5f4dcc3b5aa765d61d8327deb882cf99,那么我就用一个数据库存起来,只要我看到5f4dcc3b5aa765d61d8327deb882cf99,我就知道这个是口令'password‘使用MD5处理之后的值,原来的口令就是'password'。MD5在身份鉴别系统中用于口令保护已经是很久了事情了,大部分黑客也有针对这种Hash方式准备相应的数据库进行反查,这种数据库称为彩虹表。
  所以,为了对抗彩虹表,我们要做的工作是避免预先计算,让攻击者无法(或者非常困难)提前计算好彩虹表。
为了反映为何彩虹表计算是可行的,我们再来算一下。我们假设用户可能输入的口令是键盘上的小写字母和数字,共26+10=36种,之所以这样假设是因为 一个用户比较多的系统中总是会有一些弱口令用户的,我们假设输入的口令至少5个字符,至多12个字符,那么用户可能的输入有很多,如果再考虑到用户为了方便记忆,输入的口令是一些已经存在的单词或是词组,可能的输入将会远远少于。用户可能的输入少了,就给了我们枚举的空间。
  为了阻止这种枚举,加salt的方法是扩大用户输入的一种简单有效的途径,随机生成一个16字节的随机数,加上用户本身输入的至多12个字符的口令,可能的输入就有种,这么多种可能性,任何一个机构和组织都没有办法存储规模如此庞大的彩虹表。
另外一种方法是通过提升Hash的复杂度,延长攻击者进行暴力破解时所消耗的时间。现在显卡用于并行计算实在太容易,6位纯数字的口令在显卡看来就是秒破。Hash算法的多次迭代就是最简单的延长计算时间的方法,Apache的htpasswd就使用了MD5的1000次迭代,不过只是使得这些口令稍微难破解一些。
  另外,题中使用了SHA1和MD5两种算法的方法,除了稍微提升一点计算的难度以外,并没有多好,这种组合方法不能增加用户输入的可能性,另外虽然SHA1生成的是160位的Hash,但是由于输入是一个128位的MD5,所以输出也至多只可能有种可能,猜测的范围也没有缩小。所以这是原来回答我建议你使用更多次数(如1000次)MD5迭代的原因,至少应当有一个方面有稍微大一些的加强。
另外此文(暴力密码破解器 ocl-Hashcat-plus 支持每秒猜测最多 80 亿个密码,意味着什么?)中有数据可以供参考,bcrypt是一种有效对抗口令Hash破解的算法,建议使用

												

SHA和MD5的Salt的更多相关文章

  1. 给MD5加上salt随机盐值加密算法实现密码安全的php实现

    给MD5加上salt随机盐值加密算法实现密码安全的php实现 如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码.加上sal ...

  2. base64,AES,RSA,SHA和MD5等加密方式(jdk)

    import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import jav ...

  3. 数据摘要算法的测试效率(SHA、MD5和CRC32)

    1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(H ...

  4. 在spring security3中使用自定义的MD5和salt进行加密

    首先看代码: <authentication-manager alias="authenticationManager"> <authentication-pro ...

  5. shiro入门学习--使用MD5和salt进行加密|练气后期

    写在前面 在上一篇文章<Shiro入门学习---使用自定义Realm完成认证|练气中期>当中,我们学会了使用自定义Realm实现shiro数据源的切换,我们可以切换成从关系数据库如MySQ ...

  6. java-信息安全(一)-BASE64,MD5,SHA,HMAC

    概述 信息安全基本概念: BASE64 编码格式 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HM ...

  7. 加密算法中BASE64、MD5、SHA、HMAC等之间的区别

    http://blog.csdn.net/lplj717/article/details/51828692 根据项目需要了解了一下几种加密算法(参考其他博客),内容简要介绍BASE64.MD5.SHA ...

  8. 简要介绍BASE64、MD5、SHA、HMAC几种方法。

    加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     ...

  9. Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

    Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC 博客分类: Java/Security Javabase64macmd5sha     加密解密,曾经是我一 ...

随机推荐

  1. db2 sequence

    我的上两个专栏中已经介绍到了与版本 8 功能相关的主题.我们可能需要在今天设计的数据库和应用程序中考虑这些功能.我们已经谈论了新的数据分区的辅助索引和附加的索引修改.在上一期中,我们了解了 DSSIZ ...

  2. asp.net session丢失的解决方法小结

    现在我就把原因和解决办法写出来. ASP.NET Session丢失原因: 由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下: < sessionSt ...

  3. 5、手把手教React Native实战之盒子模型BoxApp

    用HTML5和React Native分别实现盒子模型显示 写法不一样: 1.样式 ![样式不同](http://image17-c.poco.cn/mypoco/myphoto/20160323/0 ...

  4. 使用JMAP dump及分析dump文件

    查看整个JVM内存状态 jmap -heap [pid]要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起 查看JVM堆中对象详细占用情况jmap -his ...

  5. python bottle学习(二)加载配置文件

    from bottle import (run, route, get, post, default_app, Bottle) """ 首先获得一个app对象,有两种方法 ...

  6. 提高SDN控制器拓扑发现性能

    原文由我发表在sdnlab.com.原文链接:http://www.sdnlab.com/15425.html SDN网络的一大特点就是资源由控制器集中管理,控制器管理网络,最基本的当然需要知道网络的 ...

  7. Oracle数据库 number 长度与 Short Integer Long BigDecimal 对应关系

    转自:https://blog.csdn.net/edward9145/article/details/21398657 Oracle数据库 number 长度与 Short Integer Long ...

  8. SPOJ Number of Palindromes(回文树)

    Number of Palindromes Time Limit: 100MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu ...

  9. Spoken English Practice(appetite,ache,meds,change, stop)Look like you got your appetite back, that's a good sign.

    绿色:连读:                  红色:略读:               蓝色:浊化:               橙色:弱读     下划线_为浊化 口语蜕变(2017/6/27) ...

  10. Android 点击电话号码之间拨号

    点击电话号码之间拨打电话,可用通过下面的方式实现: 假设电话号码以TextView的方式显示 1.Intent方式 在TextView的响应事件中 : String phone = tvphone.g ...