关于单向散列hash函数破解 彩虹表的简单理解

概述

我们都知道单向散列函数就如它的名字一般,单输入唯一的单输出,一个好的单向散列函数要具有抗碰撞的特性,而且要具有足够大的值空间。今天看到了彩虹表感觉很有意思在这里记录一下。

传统的散列函数破解

传统的关于散列函数的破解,主要就是穷举法了,但是当单向散列函数的位数到达一定程度的时候,其组成的值空间将会是十分庞大的,除非计算机的算力十分了得,否则将难以承担其背后巨大的计算流程。

散列链的生成

  • 第一步:先根据明文计算出其哈希值,此过程称为H函数,
  • 第二步:取计算出的hash值的前n(比如 n为 8)位得到新的字符串,将新的字符串作为明文,此过程称为R函数
  • 第三步:再次重复上面两步。
当面对要破解的哈希函数 H,首先要定义一个函数 R( 此函数自己定义,只要满足该函数的定义域和值域与哈希函数相反),通过该函数可以将哈希值映射为一个与 原文相同格式的值, 注意这里强调的是与原文格式相同的值,因为我们要得到的就是某个散列值对应的明文,比如明文是一串8位的密码,那么通过归约函数将散列值映射为一个8位的字符串,其实本质上就是在将原明文中的密码空间的值进行列举,从本质上来说还是穷举,但是却又不像。需要强调的是,由于哈希函数是不可逆的,所以对于密文进行 R运算几乎不可能得到明文原文。

彩虹表

彩虹表其实就有点像目录的查表,首先既然一个好的单向散列函数意味着唯一的输入和唯一的输出,那么当我输入A,然后利用制定好的归约函数(可以简单理解为我们设置的一个集合)对散列值进行还原,还原成集合中的密码(也就是字符集合)哈希链可以用来减少对于储存空间的需求。大致想法是通过定义一个归约函数(reduction function)R来影射散列值h在集合P中对应的密码p,集合P就是所有密码的集合(注意,这里的归约函数并不是真正意义上哈希函数的反函数。)于是就先使用hash函数,然后再使用归约函数,就这样一直持续下去,比如说持续这样的计算一百次,那么这样就得到了一个散列链如下图所示,我们最终记录在彩虹表中的内容仅仅记录散列链的首部和尾部明文字段。

假设我们在对散列函数进行散列链的操作的过程中,发现某个散列值通过R函数得到的值与彩虹表中记录的首部或者尾部的字符相同,那么就通过还原该散列链最终就可以得到原先的明文,为什么说是可能,因为即便是散列函数也有可能出现多输入,单输出的情况,也就是说出现了碰撞的情况,比如A的输出是B,C的输出也是B。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mllllk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值