格格不入 - 技术分享
type: channel
link: https://www.jbea.cn/tag/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/
items: C# MD5加密

C# MD5加密
type: item
date: 2022-08-23T16:49:57+08:00
description: 什么是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#中如何使用?直接上代码: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); } }注意:[font color="#DC143C"]虽然MD5无法解密，但是可以碰撞出来，有库就行，对于单机来说，暴力枚举法的时间成本很高，字典法的空间成本很高。但是利用分布式计算和分布式存储，仍然可以有效破解MD5算法。因此这两种方法同样被黑客们广泛使用。[/font]