有人说MD5已经被破解,不安全了
没事研究一下有可能过时的MD5,看看到底有没过时?
算法:
//using System.Security.Cryptography; public class EncryptHelper { private static Dictionary<char, string> customeMd5Dict = new Dictionary<char, string>(); static EncryptHelper() { string customeMd5Key = "0123456789ABCDEF";//可自定义修改或调换顺序 string customeMd5Value = "ABCDEF0123456789";//可自定义修改或调换顺序 for(var i=0;i<customeMd5Key.Length;i++){ customeMd5Dict.Add(customeMd5Key.ElementAt(i), customeMd5Value.Substring(i,1)); } } /// <summary> /// MD5 hash加密【默认自定义-更复杂】 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string MD5(string str, bool isCustomed = true) { if (str == null) { throw new ArgumentException("加密内容为NULL", "str"); } str = str.Replace(" ", ""); using (var md5Provider = new MD5CryptoServiceProvider()) { //长度32位 var md5 = string.Empty; if (isCustomed)//自定义md5 { string securityCode = "EncRYptMd5010100";//安全码,可自定义修改,PS:其他方式,一般需要登录的系统可使用(用户名+密码再做一些变换)加密后作为密码 //原生字符串+安全码进行MD5 md5 = BitConverter.ToString(md5Provider.ComputeHash(Encoding.UTF8.GetBytes(str.Trim() + securityCode))).Replace("-", ""); string left = "", right = ""; //经过5次固定抽取5个字符拼接 left += (char.IsDigit(md5, 6) ? md5.Substring(5, 1) : md5.Substring(7, 1)); left += (char.IsDigit(md5, 13) ? md5.Substring(12, 1) : md5.Substring(14, 1)); right += (char.IsDigit(md5, 20) ? md5.Substring(19, 1) : md5.Substring(21, 1)); right += (char.IsDigit(md5, 27) ? md5.Substring(26, 1) : md5.Substring(28, 1)); string middle = (char.IsDigit(md5, 14) ? md5.Substring(13, 1) : md5.Substring(15, 1)); md5 = (left + md5 + right).Insert(18, middle);//32+5=37位 left = ""; right = ""; for (int i = 23; i < 37; i++)//后14位变换 { right += customeMd5Dict[md5.ElementAt(i)]; } for (int i = 0; i < 13; i++)//前13位变换 { left += customeMd5Dict[md5.ElementAt(i)]; } md5 = left + md5 + right;//长度64位 } else { //标准MD5,长度32位 md5 = BitConverter.ToString(md5Provider.ComputeHash(Encoding.UTF8.GetBytes(str.Trim()))).Replace("-", ""); } return md5; } } }
测试:
public static void test() { string originalKey = "Pwd123$"; var md5 = EncryptHelper.MD5(originalKey, true); Console.WriteLine("原始密码:" + originalKey); Console.WriteLine("加密后:" + md5); Console.WriteLine("length:" + md5.Length); Console.ReadKey(); }
效果:
这自定义算法可还ok?有没有人能写出破解算法?
欢迎交流!