有人说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?有没有人能写出破解算法?
欢迎交流!