黑客相关¶
被黑客攻击后,多数公司有能力恢复数据,但是担心被窃取的数据会被泄露给竞争对手造成难以预估的后果,三分之一的受害公司会愿意支付赎金。
fork bomb¶
备注
是指在计算机中,通过不断建立新进程来消耗系统中的进程资源,它是一种黑客攻击方式。
逆向Hash¶
逆向Hash有三种办法:
1. 暴力破解法
时间成本太高
2. 字典法
提前构建一个 “明文 -> 密文” 对应关系的一个大型数据库,破解时通过密文直接反查明文。
但存储一个这样的数据库,空间成本是惊人的
3. 构建彩虹表
在字典法的基础上改进,以时间换空间。是现在破解哈希常用的办法
预先计算的散列链¶
备注
预先计算的散列链是彩虹表的前身:使用「字典法」存储所有的明文密码对需要的空间太大,密码学家们想出了一种以计算时间降低存储空间的办法:“预计算的哈希链集”(Precomputed hash chains)。
备注
约简函数(reduction function)R 函数是构建这条链的时候定义的一个函数:它的值域和定义域与 H 函数相反。通过该函数可以将哈希值约简为一个与原文相同格式的值。
原理(以 k=2 的哈希链为例):
aaaaaa -(hash函数)-> 281DAF40 -(reduction函数)->sgfnyd
-(hash函数)->920ECF10-(reduction函数)->kiebgt
这条链是这样生成的:
1. 随机选择一个明文 aaaaaa
2. 对其求哈希得到 281DAF40
3. R (281DAF40) 得到另外一个明文 sgfnyd
4. 继续重复 2,3 步骤
注: 存储的时候,不需要存储所有的节点,只需要存储每条链的头尾节点(这里是 aaaaaa 和 kiebgt)
预计算的哈希链集的意义:
1. 对于一个长度为 k 的预计算的哈希链集,每次破解计算次数不超过 k,因此比暴力破解大大节约时间
2. 每条链只保存起节点和末节点,储存空间只需约 1/k,因而大大节约了空间
R 函数的问题:
要发挥预计算的哈希链集的左右,需要一个分布均匀的 R 函数。当出现碰撞时,就会出现下面这种情况
111 --H--> EDEDED --R--> 222 --H--> FEDEFE --R--> 333 --H--> FEFEDC --R--> 444
454 --H--> FEDECE --R--> 333 --H--> FEFEDC --R--> 444 -H--> FEGEDC --R--> 555
两条链出现了重叠。这两条哈希链能解密的明文数量就远小于理论上的明文数 2×k
由于集合只保存链条的首末节点,因此这样的重复链条并不能被迅速地发现
彩虹表(rainbow table)¶
彩虹表的使用:
彩虹表的使用比哈希链集稍微麻烦一些。
1. 首先,假设要破解的密文位于某一链条的 k-1 位置处,
对其进行 Rk 运算,看是否能够在末节点中找到对应的值
2. 如果找到,则可以使用起节点验证其正确性
3. 否则,继续假设密文位于 k-2 位置处
这时就需要进行 Rk-1、H、Rk 两步运算,然后在末节点中查找结果
4. 如是反复
最不利条件下需要将密文进行完整的 R1、H、…Rk 运算后,
才能得知密文是否存在于彩虹表之中
彩虹表是一个用于加密散列函数逆运算的预先计算好的表,为破解密码的散列值(或称哈希值、微缩图、摘要、指纹、哈希密文)而准备。一般主流的彩虹表都在 100G 以上。 这样的表常常用于恢复由有限集字符组成的固定长度的纯文本密码。这是空间 / 时间替换的典型实践,比「暴力破解」处理时间少而储存空间多,但却比简单的「字典法」的破解方式储存空间少而处理时间多。使用加 salt 的 KDF 函数可以使这种攻击难以实现。彩虹表是马丁・赫尔曼早期提出的简单算法的应用。
备注
加盐哈希可以抵御彩虹表:(注意)盐可以是用户名,手机号等,但必须保证每个用户的 salt 都不一样才是安全的。彩虹表在生成的过程中,针对的是特定的函数 H,H 如果发生了改变,则已有的彩虹表数据就完全无法使用。如果每个用户都用一个不同的盐值,那么每个用户的 H 函数都不同,则必须要为每个用户都生成一个不同的彩虹表。大大提高了破解难度。