CSDN博客

img congzijie

关于Hash安全性的一些错误看法

发表于2008/10/2 3:17:00  1953人阅读

网络上流传着很多关于提升Hash加密安全性的方法,其中有一些鄙人不敢苟同,特别拿出来讨论一下。

 

1. 多轮Hash提高安全性

  这么做唯一的用途是将逐次生成-比对破解法的时间成本提高n倍(n为Hash的轮数)。之所以产生这种看法我想是因为很多人认为对于n轮Hash,要破解Hash n首先要破解Hash n-1,要破解Hash n-1,首先要破解Hash n-2……为什么呢?我想不明白,我们可以直接对于要猜解的明文进行n轮Hash,比对最后的结果就可以了:

  1. //从字典中获取一个要破解的明文
  2. Hash = dictionary[x];
  3. //进行n轮Hash
  4. for (int i=0; i<N; i++)
  5.    Hash = MD5(Hash);
  6. if (Hash == HashToCrack)
  7.    ...

 

2.变形Hash(如16Byte, 20Byte的MD5)

  这是一个常识问题,如果16Byte的哈希值可以与32Byte的哈希值有相同的安全性,那么密码学家为什么要浪费你16Byte的空间呢?提出这种看法的人我想主要是因为他们认为可以保证算法的保密性,这犯了密码学中的一个常识错误:密码到安全性应该基于密钥(这里是明文)而非算法的保密性,想一下,破解密码和拿到你源代码(尤其是Web程序)哪个更难?

  这么做只会带来两个结果:

  •  帮助攻击者缩减空间成本
  • 增加碰撞概率(换句话说就是被破解的概率)

3. 加盐(Salt)就一定安全吗?

  加盐确实很安全,几乎也是对抗彩虹表这类高效时空兑换破解法的唯一有效手段。但是这很大程度取决于Salt的强度,因为攻击者可以把明文和Salt分开破解:假设攻击者可以得到Hash结果,那么他可以设置自己的密码,然后通过枚举Salt的值来破解Salt在先,之后再在用常规手段,如彩虹表破解明文:

  1. Passwd = "Congzijie";
  2. Hash = "533dd712f5046e76779fe021e3cbf35a";
  3. for(int i=0; i<len_of_dict; i++) {
  4.    if (MD5(Passwd + Salt_dict[i]) == Hash)
  5.         printf("Salt found : %s", Salt_dict[i]);
  6. }
0 0

相关博文

我的热门文章

img
取 消
img