Loading... ## 什么是MD5? MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。 MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。 2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。 ## MD5真的安全吗? 了解MD5的同学都知道,它是**不可逆**的,即我们没办法把MD5密码还原对应的原文。道理很简单,任意长度的数据经过MD5处理后,所包含的信息量已经大大减少。要是可以还原的话,那MD5岂不是成为压缩算法??所以这里就会给很多人造成误解,以为不可逆就是不可破解,的确,复杂些的密码在一些MD5在线破解网站是破解不了的,相对来说是安全的。可是,针对一个有安全隐患的问题来说,相对安全就是不安全。随着科学技术水平的提升,MD5已经越来越不安全了! ## 如何避免MD5被破解? ### 采用多重加密 所谓的多重加密,顾名思义,就是把你要加密的原文加密成MD5密文,然后再一次将MD5密文加密成MD5密文,多试几次,一般3次以后,在线破解网站就匹配不上了,但是,匹配不上就不代表足够安全喔,只是不容易被轻易破解(因为第二次要破解的原文是一个32位的数字字母的结合,以此类推),增加破解的时间成本而已! ### 使用复杂密码(包含数字英文小数点等) 经过反复测试,使用复杂的密码也能降低被破解的风险,这也是现在很多软件系统都强制用户的密码不能低于16位数,且应包含数字英文小数点等的原因。 ## C#中如何使用? 直接上代码: ```csharp public class Md5Helper { public static string Md5(string value) { var result = string.Empty; if (string.IsNullOrEmpty(value)) return result; using (var md5 = MD5.Create()) { result = GetMd5Hash(md5, value); } return result; } static string GetMd5Hash(MD5 md5Hash, string input) { byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input)); var sBuilder = new StringBuilder(); foreach (byte t in data) { sBuilder.Append(t.ToString("x2")); } return sBuilder.ToString(); } static bool VerifyMd5Hash(MD5 md5Hash, string input, string hash) { var hashOfInput = GetMd5Hash(md5Hash, input); var comparer = StringComparer.OrdinalIgnoreCase; return 0 == comparer.Compare(hashOfInput, hash); } } ``` #### 注意: <span style='color:#DC143C'>虽然MD5无法解密,但是可以碰撞出来,有库就行,对于单机来说,暴力枚举法的时间成本很高,字典法的空间成本很高。但是利用分布式计算和分布式存储,仍然可以有效破解MD5算法。因此这两种方法同样被黑客们广泛使用。</span> 最后修改:2022 年 08 月 23 日 © 允许规范转载 赞 2 都滑到这里了,不点赞再走!?