[Misc] Hash算法 - Gukie/learning GitHub Wiki

refer

Hash算法

用途:

  1. 将长的二进制转化为一个较短的二进制值进行存储,这个可以用于校验文件是否损坏,比如下载软件的时候,可以对下载下来的文件sum的校验
  2. 可以将明文转为较难被破解的Hash值存取起来; 如果加点 ‘Salt’,被攻破的难度系数将更加高

一个优秀的Hash算法的特征:

  • 正向快速:给定明文和 Hash 算法,在有限时间和有限资源内能计算得到 Hash 值;
  • 逆向困难:给定(若干)Hash 值,在有限时间内很难(基本不可能)逆推出明文;
  • 输入敏感:原始输入信息发生任何改变,新产生的 Hash 值都应该出现很大不同;
  • 冲突避免:很难找到两段内容不同的明文,使得它们的 Hash 值一致(发生碰撞)。

常见的Hash算法

  • MD4,MD5 MD(Message Digest);
  • SHA-1, SHA-2 (SHA: Secure Hash Algorithm)

Hash与加密的区别

  1. Hash不可逆,加密可逆
  • Hash: 不可逆,即即使知道hashcode,也不能解出对应的原文是多少; 因为:有多少hashcode是固定的,而key则是无穷的,所以一个hashcode会对应多个key
  • 加密: 是可逆的,只要给定密文+密钥,就可以解出明文
  1. Hash的值是定长的,而加密后的密为则是根据明文的长度会变化

何时选择使用 Hash,何时选择使用加密

基本原则是:如果被保护数据仅仅用作比较验证,在以后不需要还原成明文形式,则使用哈希;如果被保护数据在以后需要被还原成明文,则需要使用加密。

Hash的增强与破解

  • 增强,对于一个简单的key,可以通过多次Hash得到一个几乎不可能攻破的HashCode
  • 破解,常见的有两种方法:
  • 穷举法,这种算法就是穷举所有的可能,找出可能的key
  • 寻找碰撞法,寻找一个拥有相同HashCode的key