网络上流传着很多关于提升Hash加密安全性的方法,其中有一些鄙人不敢苟同,特别拿出来讨论一下。
1. 多轮Hash提高安全性
这么做唯一的用途是将逐次生成-比对破解法的时间成本提高n倍(n为Hash的轮数)。之所以产生这种看法我想是因为很多人认为对于n轮Hash,要破解Hash n首先要破解Hash n-1,要破解Hash n-1,首先要破解Hash n-2……为什么呢?我想不明白,我们可以直接对于要猜解的明文进行n轮Hash,比对最后的结果就可以了:
- //从字典中获取一个要破解的明文
- Hash = dictionary[x];
- //进行n轮Hash
- for (int i=0; i<N; i++)
- Hash = MD5(Hash);
- if (Hash == HashToCrack)
- ...
2.变形Hash(如16Byte, 20Byte的MD5)
这是一个常识问题,如果16Byte的哈希值可以与32Byte的哈希值有相同的安全性,那么密码学家为什么要浪费你16Byte的空间呢?提出这种看法的人我想主要是因为他们认为可以保证算法的保密性,这犯了密码学中的一个常识错误:密码到安全性应该基于密钥(这里是明文)而非算法的保密性,想一下,破解密码和拿到你源代码(尤其是Web程序)哪个更难?
这么做只会带来两个结果:
- 帮助攻击者缩减空间成本
- 增加碰撞概率(换句话说就是被破解的概率)
3. 加盐(Salt)就一定安全吗?
加盐确实很安全,几乎也是对抗彩虹表这类高效时空兑换破解法的唯一有效手段。但是这很大程度取决于Salt的强度,因为攻击者可以把明文和Salt分开破解:假设攻击者可以得到Hash结果,那么他可以设置自己的密码,然后通过枚举Salt的值来破解Salt在先,之后再在用常规手段,如彩虹表破解明文:
- Passwd = "Congzijie";
- Hash = "533dd712f5046e76779fe021e3cbf35a";
- for(int i=0; i<len_of_dict; i++) {
- if (MD5(Passwd + Salt_dict[i]) == Hash)
- printf("Salt found : %s", Salt_dict[i]);
- }
关于Hash安全性的一些错误看法
最新推荐文章于 2024-08-24 22:07:24 发布