[Misc] Hash算法 - Gukie/learning GitHub Wiki
refer
- https://yeasy.gitbooks.io/blockchain_guide/content/crypto/hash.html
- http://www.cnblogs.com/leoo2sk/archive/2010/10/01/hash-and-encrypt.html(Hash与加密的区别)
Hash算法
用途:
- 将长的二进制转化为一个较短的二进制值进行存储,这个可以用于校验文件是否损坏,比如下载软件的时候,可以对下载下来的文件sum的校验
- 可以将明文转为较难被破解的Hash值存取起来; 如果加点 ‘Salt’,被攻破的难度系数将更加高
一个优秀的Hash算法的特征:
- 正向快速:给定明文和 Hash 算法,在有限时间和有限资源内能计算得到 Hash 值;
- 逆向困难:给定(若干)Hash 值,在有限时间内很难(基本不可能)逆推出明文;
- 输入敏感:原始输入信息发生任何改变,新产生的 Hash 值都应该出现很大不同;
- 冲突避免:很难找到两段内容不同的明文,使得它们的 Hash 值一致(发生碰撞)。
常见的Hash算法
- MD4,MD5 MD(Message Digest);
- SHA-1, SHA-2 (SHA: Secure Hash Algorithm)
Hash与加密的区别
- Hash不可逆,加密可逆
- Hash: 不可逆,即即使知道hashcode,也不能解出对应的原文是多少; 因为:有多少hashcode是固定的,而key则是无穷的,所以一个hashcode会对应多个key
- 加密: 是可逆的,只要给定密文+密钥,就可以解出明文
- Hash的值是定长的,而加密后的密为则是根据明文的长度会变化
何时选择使用 Hash,何时选择使用加密
基本原则是:如果被保护数据仅仅用作比较验证,在以后不需要还原成明文形式,则使用哈希;如果被保护数据在以后需要被还原成明文,则需要使用加密。
Hash的增强与破解
- 增强,对于一个简单的key,可以通过多次Hash得到一个几乎不可能攻破的HashCode
- 破解,常见的有两种方法:
- 穷举法,这种算法就是穷举所有的可能,找出可能的key
- 寻找碰撞法,寻找一个拥有相同HashCode的key