原文链接:http://blog.csdn.net/ddk3001/article/details/52647990
1 生日攻击
生日攻击是利用概率论中的生日问题,找到冲突的Hash值,伪造报文,使身份验证算法失效。
生日攻击的理论描述有些复杂,不易理解,请参考相关资料。
本文以实例方式介绍生日攻击方法和防范方法。
关于生日问题的简单说明:
如果输出是256位,我们随机地选择输入,并计算哈希值,在检验第 2256 2 256 +1个输入之前便很可能找到碰撞。
实际上,如果我们随机选择 2130 2 130 +1个输入,找到至少两个相同哈希值的概率为99.8%。
仅仅通过检验可能输出数量的平方根次数,便大体能找到碰撞,这在概率论中称为生日悖论(birthday paradox)。
2 实例场景
2.1 场景说明
A要对一个合同文件进行签名,然后把合同文件和签名一起发送给接收者。
签名的方法:计算文件的哈希值(m位),然后使用A的私钥对这个哈希值进行加密。
接收者使用A的公钥进行解密,然后比较哈希值,这样他就能确认:
- 接收到的合同文件是A发送的 (因为:可以使用A的公钥对加密的哈希值进行解密)
- 合同文件未被修改过 (因为:解密的哈希值与合同文件的哈希值相同)
攻击者B想要伪造一份假合同文件,然后发送给接收者,并使接收者仍然相信:
- 接收到的合同文件是A发送的 (要求:必须能用A的公钥对加密的哈希值进行解密)
- 合同文件未被修改过 (要求:解密的哈希值与合同文件的哈希值相同)
2.2 攻击方法
B先准备
2m/2
2
m
/
2
个有效合同文件(集合X),每个文件包含与原合同文件相同的意思。
B再准备
2m/2
2
m
/
2
个伪造合同文件(集合Y),每个文件也都是希望的伪造合同的意思。
注:要产生包含相同意思的许多文件,其实不难做到。
例如要生成 232 2 32 个文件,方法是:
在文件中找到32个地方,每个地方使用两种方式表达相同意思,这样组合起来,就有了 232 2 32 个文件,这些文件要表达的意思都相同。
然后比较集合X和集合Y,找到哈希值相同的两个文件,一份是有效合同,一份是伪造合同。
B成功的概率会大于0.5,如果没有找到匹配的文件,就再准备更多的有效文件和伪造文件,直到找到两个匹配的文件。
注:如果使用64位哈希值,那么只需要 232 2 32 个不同文件,这无法防住现代计算机系统。
B把找到的有效合同文件提供A,A看了一下,没什么问题,就做了签名,然后发送给接收者。
在接收者收到消息之前,B截获了这个消息,然后使用伪造合同替换了有效合同,再把伪造合同和原签名一起发送给接收者。
因为伪造合同与有效合同的哈希值相同,所以它们产生相同的签名。
这样,即使B不知道A的私钥,他也能成功!!!
我们再来看一下,攻击者如何使接收者仍然相信:
- 接收到的合同文件是A发送的 (因为:仍然是原签名,所以,接收者仍然可以用A的公钥对加密的签名进行解密。)
- 合同文件未被修改过 (因为:解密的哈希值与合同文件的哈希值相同,实际上已经替换为伪造合同,但伪造合同与有效合同的哈希值相同。)
2.3 遭遇失败
如果A是一个认真的人,他在对B提供的有效合同文件进行签名之前,又仔细阅读了合同,修改了其中的标点符号问题,然后才对文件进行签名。
这样,B的计划就失败了。
B面临的问题是:找到一个伪造合同,与新的合同文件具有相同的哈希值。
这几乎是不可能的!!!
3 防范方法
使用安全的哈希算法:安全的哈希算法生成的哈希值有足够多的位数。这样,攻击者在寻找两个具有相同哈希值的文件时就会非常困难。
加盐:在为文件签名之前,先向文件添加一个随机值,然后计算哈希值,再将文件、签名和随机值一起发送给接收者。这样,攻击者必须找出具有特定哈希值的伪造文件,这非常困难。
改动文件:在为文件签名之前,对文件做少许改动。这样,攻击者必须找出具有特定哈希值的伪造文件,这非常困难。