首页 > 其他分享 >初识彩虹表

初识彩虹表

时间:2023-12-04 13:45:24浏览次数:25  
标签:彩虹 rainbow hash alarm bytes 初识 33554432

1. 散列链

1.1 背景

大部份资料来自维基百科:彩虹表

对于一个用户认证系统,一般不会明文储存用户的密码,而是储存其加密摘要,用户输入密码时,生成加密摘要与储存的密码摘要进行比对,相同则允许其访问请求。

假设黑客盗取了散列后的密码表,由于记录的是密码计算后获得的摘要,因此黑客无法直接使用这份密码表获取权限,为了获得正确的密码,有以下几种方法进行攻击:

  1. 暴力破解
  2. 字典攻击
  3. 使用预先计算好的散列链

其中,暴力破解在进行计算时的时间成本过高;字典攻击需要的空间成本过高;因此有了提前构筑计算好的散列链,牺牲一些时间换空间,目前这种做法在破解哈希中是常见的。

1.2 简介

大部份资料来自维基百科:彩虹表

假设有哈希方程\(H\),构建一个归约函数\(R\),其作用不是将Hash值重新映射到原本的输入,而是将Hash值映射成类似原文(如长度,使用的字符类型等)的文本。

使用wikipedia上的例子,它构建了假设密码集合P是6个字符长,Hash值有32bit长,长度K=4(应该是)的散列链如下:

\((aaaaaa)\overrightarrow{H}(281DAF40)\overrightarrow{R}(sgfnyd)\overrightarrow{H}(920ECF10)\overrightarrow{R}(kiebgt)\)

对于生成的散列链,只记录其初始密码(起点)和末尾密码(终点),即在生成查找表时只记录起点和终点。

对于查找,不再赘述,直接截图了。

rainbow_table

在查找的途中,可能会出现误报(false alarm)的情况如下图:

rainbow_table

这是因为对生成的散列链,若有节点发生了碰撞,这就意味着若表中的任意两条链中的某一节点发生碰撞,就会导致其链上的大部分节点都将相同。这是由于设计的归约函数R没有抗碰撞性导致的,而为了能正确的覆盖掉可能的明文,所以R不会具有抗碰撞性。

为了解决简单的哈希链中的碰撞问题,彩虹表选用一系列相关的归约函数R1,…,Rk来代替原先的归约函数R。这样,如果两条哈希链发生碰撞并且重合,那么它们的碰撞必定发生在相同的位置,从而它们的终点也将相同。这样可以通过后处理来排序哈希链,从而找出并移除所有终点相同,因而可能是重复的链,并生成新的链来将整个表补充完整。这样得到的表中的链可能有碰撞的部分,但它们不会发生链的重合,从而大幅降低了碰撞的次数。

2.彩虹表

2.1 使用工具

生成彩虹表使用到的工具是RaninbowCrack,这个工具提供了rtgen,rtsort,rcrack等程序,可完成对彩虹表的生成、排序和查找等操作。

2.2 具体使用

官方文档里给出了详细的用法以及各个参数的详细说明,这里就不再赘述了,附上官方说明:Rainbow Table Generation and Sort(彩虹表的生成与排序)

2.3 例子说明

运行环境为Windows10系统,尝试使用RainbowCrack工具执行对如下字符串的散列的破解:

  1. 有字符串"cryptography",使用md5计算获得的HEX散列为"e0d00b9f337d357c6faa2f8ceae4a60d"
  2. 使用rtgen生成彩虹表,使用语句如下:
//使用md5算法,在小写字母集合里,构筑1~12位的密码集合生成彩虹表,单链长度为3800,生成的链数量为33554432条
rtgen md5 loweralpha 1 12 0 3800 33554432 0 

//运行效果如下
rainbow table md5_loweralpha#1-12_0_3800x33554432_0.rt parameters
hash algorithm:         md5
hash length:            16
charset name:           loweralpha
charset data:           abcdefghijklmnopqrstuvwxyz
charset data in hex:    61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a
charset length:         26
plaintext length range: 1 - 12
reduce offset:          0x00000000
plaintext total:        99246114928149462

sequential starting point begin from 0 (0x0000000000000000)
generating...
196608 of 33554432 rainbow chains generated (0 m 33.1 s)
393216 of 33554432 rainbow chains generated (0 m 32.1 s)
589824 of 33554432 rainbow chains generated (0 m 31.8 s)
786432 of 33554432 rainbow chains generated (0 m 31.1 s)
......//中间的省略了
33423360 of 33554432 rainbow chains generated (0 m 37.7 s)
33554432 of 33554432 rainbow chains generated (0 m 23.2 s)

生成的彩虹表大小有512MB,花了我差不多85min左右才生成成功。运行的时候CPU直接跑满了。
rainbow_table

  1. 对生成的彩虹表进行排序:
//该命令会对当前目录下的所有彩虹表进行排序
rtsort .

//运行效果如下
.\md5_loweralpha#1-12_0_3800x33554432_0.rt:
7087034368 bytes memory available
loading data...
sorting data...
writing sorted data...
  1. 接下来尝试查找表
rcrack . -h e0d00b9f337d357c6faa2f8ceae4a60d

//运行结果如下:
1 rainbow tables found
memory available: 5781658009 bytes
memory for rainbow chain traverse: 60800 bytes per hash, 60800 bytes for 1 hashes
memory for rainbow table buffer: 2 x 536870928 bytes
disk: .\md5_loweralpha#1-12_0_3800x33554432_0.rt: 536870912 bytes read
disk: finished reading all files

statistics
----------------------------------------------------------------
plaintext found:                             0 of 1
total time:                                  0.45 s
time of chain traverse:                      0.42 s
time of alarm check:                         0.00 s
time of disk read:                           0.19 s
hash & reduce calculation of chain traverse: 7216200
hash & reduce calculation of alarm check:    0
number of alarm:                             0
performance of chain traverse:               17.06 million/s
performance of alarm check:                  0.00 million/s

result
----------------------------------------------------------------
e0d00b9f337d357c6faa2f8ceae4a60d  <not found>  hex:<not found>

对于生成的这个表,没有查找到"critography"对应的散列值,尝试对"hello"的散列值"5d41402abc4b2a76b9719d911017c592"进行查询,成功找到对应明文。

rcrack . -h 5d41402abc4b2a76b9719d911017c592

1 rainbow tables found
memory available: 5857804288 bytes
memory for rainbow chain traverse: 60800 bytes per hash, 60800 bytes for 1 hashes
memory for rainbow table buffer: 2 x 536870928 bytes
disk: .\md5_loweralpha#1-12_0_3800x33554432_0.rt: 536870912 bytes read
disk: finished reading all files
plaintext of 5d41402abc4b2a76b9719d911017c592 is hello

statistics
----------------------------------------------------------------
plaintext found:                             1 of 1
total time:                                  0.41 s
time of chain traverse:                      0.38 s
time of alarm check:                         0.00 s
time of disk read:                           0.17 s
hash & reduce calculation of chain traverse: 7216200
hash & reduce calculation of alarm check:    1
number of alarm:                             1
performance of chain traverse:               19.19 million/s
performance of alarm check:                  0.00 million/s

result
----------------------------------------------------------------
5d41402abc4b2a76b9719d911017c592  hello  hex:68656c6c6f

对于查表失败的结果,可以尝试改变table_index参数的值,使用不同的归约函数产生新的彩虹表,这样就有可能覆盖到之前查表失败的hash值对应的明文。

标签:彩虹,rainbow,hash,alarm,bytes,初识,33554432
From: https://www.cnblogs.com/H4RUH1RO/p/17874736.html

相关文章

  • Web安全-初识SQL注入(一)
    1、初识SQL注入1.1、什么是注入?将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。注入能导致数据丢失、破坏或泄露给无授......
  • Java 初识
    Java初识一、三大版本:writeonce、runanywhere.JavaSE(核心):标准版(桌面程序,控制台开开)JavaME:嵌入式开发(手机,小家电)JavaEE:企业级开发(web端,服务器开发)二、JDK,JRE,JVMJDK:javadevelopmentkitJRE:javaruntimeenvironmentJVM:javavirtualmachine三、Java开发......
  • 初识Linux
    在当今数字化时代,云计算作为一项重要的技术,正深刻地改变着我们对计算和数据存储的认识。而要深入了解云计算,Linux作为其核心操作系统则成为必不可少的一环。本文将带你一探云计算的奥秘,介绍Linux的基本概念,并指导你如何在虚拟机中安装Linux系统。云计算简介云计算是一种基于互联......
  • [引]初识ArkTS语言
    ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。因此,在学习ArkTS语言之前,建议开发者具备TS语言开发能力 初识ArkTS语言-学习ArkTS语言-入门-HarmonyOS应用开发 在初步了解了ArkTS语......
  • 初识Linux的文件基本权限和用法
    引言Linux操作系统以其稳定性和安全性而闻名,文件权限是Linux系统中重要的安全机制之一。本篇博客将介绍Linux文件的基本权限概念以及如何使用命令行进行文件权限的管理。文件权限概述在Linux中,每个文件都有一组权限,用于定义文件的访问规则。这组权限分为三个部分:用户(Owner)、群组(Gr......
  • 初识Linux学习笔记
    引言作为一名计算机专业的学生,深入了解和熟练使用Linux操作系统是至关重要的。Linux在计算机领域有着广泛的应用,不论是服务器端还是嵌入式系统,都离不开Linux的支持。本文将介绍我个人初识Linux的学习经验,包括基本概念、常用命令以及一些实际应用。什么是Linux?Linux是一种开源的类U......
  • 第1章 初识Linux
    1.Linux介绍历史:Linux操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:UNIX操作系统、MINIX操作系统、GNU计划、POSIX标准和Internet网络。UNIX最初免费发布,在1990年,UNIX在服务器市场尤其是大学校园成为主流操作系统,许多校园都有UNIX主机,当然还包括一些研究它的......
  • 01初识Linux
    1.1、操作系统概述1、学习目标:了解操作系统的作用了解常见的操作系统2、硬件和软件我们所熟知的计算机是由硬件和软件组成的。硬件:计算机系统中由电子、机械和光电元件等组成的各种物理装置的总称。(看的见、摸得着的东西:CPU、内存硬盘、显示屏、鼠标等)软件:是用户和计算机硬件......
  • 初识Linux
    1.在这里我了解到了云计算的概念:云计算是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来虚拟化资源。2.云计算的服务特征以及发展现状。(1)可以随时随地使用任何网络设备进行访问。(2)可以多人共享资源。(3)可以快速重新部署服务,十分灵活。(4)服务自动化。(5)服务......
  • 初识web
    初识web 1一个网站通常由三部分组成:HTML负责网页的结构(页面的元素和内容)CSS负责网页的表现(页面元素的外观,位置等页面的样式,如颜色,大小)JavaScript负责网页的行为(交互效果)2HTML的快速入门HTML结构标签<html>      <head>            <title>......