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

网络上流传着很多关于提升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. }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值