MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错)。任何长度的任意内容都可以用MD5计算出散列值。
介绍工具:CalcMD5.zip。 MD5算法不可逆,也就是只能得到内容对应的MD5值,无法由MD5值反推内容。对于不同的内容产生相同MD5值的概率非常非常非常低!
Password字段保存用户输入密码的MD5值,这样系统管理员、黑客也不知道用户的密码是什么,也就避免了用户的其他系统密码被利用的问题(思考:密码明文存储有哪些缺点?)。
判断密码正确性的方法:计算用户输入的密码的MD5值,与数据库存储的MD5值进行比较,如果相等则认为密码正确。为什么很多网站只有密码重置,没有找回原密码功能?。
应用:计算文件的MD5值来检验文件没有被篡改过。
1、MD5算法不是一种加密算法。因为有加密就有解密,而MD5算法算出来的值是不能解密的,也就是说MD5没有解密。是算法但不是加密算法。不管明文长度是多少,经过MD5算法计算后得到的MD5值长度都是固定的。
2、MD5算法不仅可以计算一个字符串的MD5值,还可以计算一个文件的MD5值。
有个工具叫:MD5逆向暴力破解,所以很多网站一般会提示用户密码尽量长一点、复杂一点,甚至会提示用户每过一定的时间更改一次密码,就是这个道理。
MD5算法理论上是不可逆的,因此攻击的唯一办法就是碰撞。两个不同的内容生成相同的MD5值,这就叫碰撞。MD5算法的碰撞概率非常小。找到一个内容虽然不同但是产生同样MD5的内容即可。
不要露怯,王小云不是破解了MD5算法,只是发现缩短枚举碰撞时间的理论而已。它是收集了大量常用的字符串的MD5值,保存“字符串—MD5”的对应关系,本质上仍然是穷举法。只能用于应付一下常见的问题,对于文件、长字符串是没作用的。
MD5的其他应用简介:第三方支付(如:支付宝)用MD5对金额、订单号等进行散列计算,来保证数据是对方发出的。
和MD5类似的还有SHA等算法。
MD5代码:
public static string GetMD5(string sDataIn){MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();byte[] bytValue, bytHash;bytValue = System.Text.Encoding.UTF8.GetBytes(sDataIn);bytHash = md5.ComputeHash(bytValue);md5.Clear();string sTemp = "";for (int i = 0; i < bytHash.Length; i++){sTemp += bytHash[i].ToString("X").PadLeft(2, '0');}return sTemp.ToLower();}