MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆;所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,通过比在表中比破解密码的MD5算法散列值,通过匹配从映射表中找出破解密码所对应的原始明文。
对信息系统或者网站系统来说,MD5算法主要用在用户注册口令的加密,对于普通强度的口令加密,可以通过以下三种方式进行破解:
(1)在线查询密码。一些在线的MD5值查询网站提供MD5密码值的查询,输入MD5密码值后,如果在数据库中存在,那么可以很快获取其密码值。
(2)使用MD5破解工具。网络上有许多针对MD5破解的专用软件,通过设置字典来进行破解。
(3)通过社会工程学来获取或者重新设置用户的口令。
因此简单的MD5加密是没有办法达到绝对的安全的,因为普通的MD5加密有多种暴力破解方式,因此如果想要保证信息系统或者网站的安全,需要对MD5进行改造,增强其安全性,本文就是在MD5加密算法的基础上进行改进!
贴代码:
/// <summary> /// MD5 /// </summary> public static class Md5 { private static string ReturnValue = string.Empty; /// <summary> /// MD5加密 /// </summary> /// <param name="password">需要加密的字段</param> /// <param name="x">加密后的字符大小写(默认小写传值后大写)</param> /// <param name="codeLength">加密后的长度默认32位 传入16取16位</param> /// <returns>加密后的字符</returns> public static string Encryption(string password, string x = "x", int codeLength = 32) { try { if (!string.IsNullOrEmpty(password)) { #region 32位加密 if (codeLength == 32) { MD5 md5 = MD5.Create(); byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 for (int i = 0; i < s.Length; i++) { // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符,默认X if (x == "x") ReturnValue = ReturnValue + s[i].ToString("x"); else ReturnValue = ReturnValue + s[i].ToString("X"); } } #endregion #region 64位 else if (codeLength == 64) { string cl = password; //实例化一个md5对像 MD5 md5 = MD5.Create(); // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择 byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl)); ReturnValue = Convert.ToBase64String(s); } #endregion #region 16位MD5加密(取32位加密的9~25字符) else { var md5 = new MD5CryptoServiceProvider(); string t2 = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(password)), 4, 8); if (x == "x") ReturnValue = t2.Replace("-", "").ToLower(); else ReturnValue = t2.Replace("-", ""); } #endregion } } catch (Exception ex) { ReturnValue = ex.Message; } return ReturnValue; } }