1、基础知识

刚刚学习过数字签名的相关知识,以及数字签名的伪造技术,而伪造数字签名归根结底就是密码破解的一个过程,然而直接破解的速度是非常缓慢的,所以有人想出一种办法,直接建立出一个数据文件,里面事先记录了采用和目标采用同样算法计算后生成的Hash散列数值,在需要破解的时候直接调用这样的文件进行比对,破解效率就可以大幅度地,甚至成百近千近万倍地提高,这样事先构造的Hash散列数据文件在安全界被称之为Table。

其实简单理解就是使用一个大型数据字典来进行快速匹配暴力破解的方法,以空间来换取时间的方法。

具体的需要一些基础知识做支撑:

1、哈希算法

哈希(Hash)算法是单向散列算法,它把某个较大的集合P映射到另一个较小的集合Q中,假如这个算法叫H,那么就有Q = H(P)。对于P中任何一个值p都有唯一确定的q与之对应,但是一个q可以对应多个p。作为一个有用的Hash算法,H还应该满足:

H(p)速度比较快; 给出一个q,很难算出一个p满足q = H(p);即单向性。

给出一个p1,很难算出一个不等于p1的p2使得 H(p1)=H(p2);强弱碰撞性。

正因为有这样的特性,Hash算法经常被用来保存密码————这样不会泄露密码明文,又可以校验输入的密码是否正确。常用的 Hash算法有MD5、SHA1等。

2、破解HASH

破解Hash的任务就是,对于给出的一个q,反算出一个p来满足q = H(p)。即直接采用碰撞的方法来打破它的强弱碰撞性。通常我们能想到的办法有两种:

1、暴力破解法,把P中的每一个p都算一下H(p),直到结果等于q;

2、查表法,使用一个大型字典,把每个p和对应的q都记录下来,按q做一下索引,直接查找匹配。

两种办法理论上都是可以的,但是前一种需要大量时间,后一种需要大量存储。这种单纯的开销是很巨大的,所以目前我们认为Hash是足够安全的,十几位以上的密码也是强度足够的。

3、彩虹表 时空的平衡

对于HASH的传统做法是把H(X)的所有输出穷举,查找H(X[y])==H(P),得出P==X[y]。而彩虹表则是使用散列链的方式进行

"散列链"是为了降低传统做法空间要求的技术,想法是定义一个衰减函数 R 把散列值变换成另一字符串。通过交替运算H函数和R函数,形成交替的密码和散列值链条。

2、详解

当面对要破解的哈希函数H,首先定义一个约简函数(reduction function)R该函数的定义域和值域需要和哈希函数相反,通过该函数可以将哈希值约简为一个与原文相同格式的值("plain text" value)。需要强调的是,由于哈希函数H是不可逆的,所以对于密文进行R运算几乎不可能得到明文原文。例如,五位字母明文“zhihu”进行H运算后得到了“D2A82C9A”,而对“D2A82C9A”进行R运算后得到另一个五位字母格式的值“vfkkd”。因为这个值落在H的定义域中,因此可以对它继续进行H运算。
就这样,将H运算、R运算、H运算……这个过程反复地重复下去,重复一个特定的次数 k 以后,就得到一条哈希链,例如k为2时得到:

要生成一个表,我们选择一组随机的初始密码,每一个密码计算一个固定长度K的链,并只存储每一个链的第一个和最后一个密码。第一密码被称为始点,最后一个被称为末点。在上面例举的链中,“zhihu”就是始点,“crepa”就是末点,其他密码(或散列值)并不被保存

造表过程:

查表过程:

参考:

彩虹表破解开机密码、MD5算法等的原理

http://www.91ri.org/7593.html

[基础技能] 安全技术——哈希算法密码破解之彩虹表(Rainbow Table)学习的更多相关文章

  1. 一致性哈希算法(适用于分库分表、RPC负载均衡)转

    在分布式应用中,应该来说使用到hash最多的地方就是rpc负载均衡和分库分表,通常对于正式意义上的分布式应用来说,扩容和收缩是一个半自动化的过程,在此期间,应用基本上是可用的,所以不能发生大规模动荡的 ...

  2. 20155325 信息安全技术 实验二 Windows口令破解

    内容一览 实验结果 遇到的问题 思考题 详细步骤与解析(为了使存做笔记资料而做) 实验结果 字典破解 暴力破解 -不同密码强度的破解时间比较 用户名 密码 破解方式 破解时间 TEST (年月日) 字 ...

  3. 20155327 信息安全技术 实验二 Windows口令破解

    课程:信息安全概论 班级:1553 姓名:了李百乾 学号:20155327 成绩: 指导教师: 李冬冬 实验日期及时间: 2017年10月11日 15:30-18:00 必修/选修:必修 实验序号:0 ...

  4. 如何破解密码的哈希值,破解双MD5密码值

    这是关于我如何破解密码的哈希值1亿2200万* John the Ripper和oclHashcat-plus故事. 这是几个月前,当我看到一条推特:从korelogic约含共1亿4600万个密码的密 ...

  5. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  6. Linux基础系列-系统密码破解

    无引导介质(光盘.iso)救援模式下root密码破解 第一步: GRUB启动画面读秒时按上下方向键,进入GRUB界面 第二步: 使用上下光标键选择要修改的操作系统启动内核(默认选择的即可),按e键进行 ...

  7. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  8. .NET平台开源项目速览(12)哈希算法集合类库HashLib

    .NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部分情况下已经满足了需求,而且.NET实现的都是目前国际上 ...

  9. 秀尔算法:破解RSA加密的“不灭神话”

    RSA加密 VS 秀尔算法 作为RSA加密技术的终结者——“太多运算,无法读取”的秀尔算法(Shor’s algorithm)不是通过暴力破解的方式找到最终密码的,而是利用量子计算的并行性,可以快速分 ...

随机推荐

  1. 4. K线经典组合及意义一

    一. K线的三种形态: 1. 上升形态 2. 下跌形态 3. 顶部及底部形态 二. K线组合三大类 1. 上升形态,当这种K线或K线组合出现,表示股价要上涨. 2. 下跌形态,当这种K线或K线组合出现 ...

  2. DIV+CSS布局中主要CSS属性介绍

    Float: Float属性是DIV+CSS布局中最基本也是最常用的属性,用于实现多列功能,我们知道<div>标签默认一行只能显示一个,而使用Float属性可以实现一行显示多个div的功能 ...

  3. WPF菜单

    1.Menu Menu 是水平放置它的项的,默认情况下把灰色栏作为背景. 把Menu 添加到它的ItemsControl 基类的唯一公开的API 是IsMainMenu 属性.当为true(默认的)时 ...

  4. kali 安装ss代理客户端的方法(纯属个人总结)

    1.声明版本,因为别的版本没测试过 2.下载客户端安装包 wget https://github.com/shadowsocks/shadowsocks/archive/master.zip 这个是代 ...

  5. kvm虚拟机静态和动态迁移

    一.kvm虚拟机静态迁移 1.静态迁移就是虚拟机在关机状态下,拷贝虚拟机虚拟磁盘文件与配置文件到目标虚拟主机中,实现的迁移. (1)虚拟主机各自使用本地存储存放虚拟机磁盘文件 本文实现基于本地磁盘存储 ...

  6. struts2笔记(2)

    <context-param> <param-name>pattern</param-name> <param-value>yyyy-MM-dd hh: ...

  7. 【mongo】聚合相关资料

    一个很好的博客:http://www.cnblogs.com/shanyou/p/3494854.html 官网:https://docs.mongodb.com/manual/reference/o ...

  8. iOS_直播类app_HTTP Live Streaming

    http://www.2cto.com/kf/201606/513980.html https://developer.apple.com/library/ios/technotes/tn2224/_ ...

  9. luac++

    Cocos2d-x下Lua调用自定义C++类和函数的最佳实践 洪亮 305 2014年08月09日 发布   1 推荐 21 收藏,14.9k 浏览 关于cocos2d-x下Lua调用C++的文档看了 ...

  10. python之platform模块

    python之platform模块 ^_^第三个模块从天而降喽!! 函数列表 platform.system() 获取操作系统类型,windows.linux等 platform.platform() ...