阅读下面链接的文章后:
http://news.ycombinator.com/item?id=910203
我现在正在努力证明并理解为什么下面列出的哈希是不安全的,不应该由程序员练习.
H(k || m) - > SHA1("秘密密钥"+"name = bob,withdraw = $ 200")
H(m || k) - > SHA1("name = bob,withdraw = $ 200"+"secret-key")
正如文章所述,第一个例子完全是致命的.SHA1(以及MD5和许多其他哈希)是共享一个名为Merkle-Damgaard的通用设计的机器,这意味着它们以块长度块处理消息,并使用这些块来置换内部状态.输出SHA1是该状态的"最终"内容.但实际上没有什么能够"完成"SHA1状态; 如果您在线上看到SHA1值,您可以继续使用额外数据启动Merkle-Damgaard机器.这意味着您可以使用任意数据添加到新的消息中,这些数据会显示为真实的.这种攻击非常容易实施; 它需要大约20行Ruby代码.
第二个例子也被打破了,这是这篇博文的主题.如果你在消息之后加上键,你就不能继续用数据驱动哈希,因为你无法猜到的秘密就在它的末尾.
我在C#中编写了一个简单的哈希函数,试图证明作者声称的内容,但无论我添加/填充或在消息的后面/前面,无论如何我都无法做到这一点.
string strRet;
// hash contains the SHA 1 value of SHA1 (key + temp)
string hash = "ce0037fbbff7a1b68b5794bd73dcc7d63338f115";
try
{
string key = "password";
string temp = "name=bob,withdraw=$200";
for (int i = 0; i < 1000; i++)
{
byte[] buffer = Encoding.ASCII.GetBytes(temp);
SHA1CryptoServiceProvider cryptoTransformSHA1 = new …Run Code Online (Sandbox Code Playgroud)