当我们需要保存某些密码信息以用于身份确认时,如果直接将密码信息以明码方式保存在数据库中,不使用任何保密措施,系统管理员就很容易能得到原来的密码信息,这些信息一旦泄露, 密码也很容易被破译。MD5算法可以很好地解决这个问题,因为它可以将任意长度的输入串经过计算得到固定长度的输出,而且只有在明文相同的情况下,才能等到相同的密文,并且这个算法是不可逆的即便得到了加密以后的密文,也不可能通过解密算法反算出明文。 接下来看代码实现:
static void Main(string[] args)
{
//123
// 202CB962AC59075B964B07152D234B70
//不加x: 3244185981728979115075721453575112
//加上X: 202cb962ac5975b964b7152d234b70
//加上x2: 202cb962ac59075b964b07152d234b70
//加上x2(X大写) 202CB962AC59075B964B07152D234B70//完全一样
string s = GetMD5("123");
Console.WriteLine(s);//
Console.WriteLine("Hello World!");
Console.ReadKey();
}
public static string GetMD5(string str) {
//创建MD5对象
MD5 md5 = MD5.Create();
//开始加密
//需要将字符串转化成字节数组
byte[] buffer = Encoding.Default.GetBytes(str);
byte[] MD5Buffer = md5.ComputeHash(buffer);
//将字节数组转化成字符串
//字节数组---字符串
//将字节数组中每个元素按照指定的编码格式解析成字符串
//直接将数组ToString();
//将字节数组中的每个元素Tostring();
//return Encoding.Default.GetString(MD5Buffer);//指定编码解析乱码
string strNew = "";
for (int i = 0; i < MD5Buffer.Length; i++)
{
strNew += MD5Buffer[i].ToString("x2");//加个参数x表示16进制,不加就是10进制,再加上2就正常了
}
return strNew;
}
我们用的是将字节数组中的每个元素Tostring() 其中tostring方法还有一个小知识点:
12345.ToString("n"); //生成 12,345.00
12345.ToString("C"); //生成 ¥12,345.00
12345.ToString("e"); //生成 1.234500e+004
12345.ToString("f4"); //生成 12345.0000
12345.ToString("x"); //生成 3039 (16进制)
12345.ToString("p"); //生成 1,234,500.00%
大写X:ToString(“X2”)即转化为大写的16进制。 小写x:ToString(“x2”)即转化为小写的16进制。 2表示每次输出两位,不足2位的前面补0,如 0x0A 如果没有2,就只会输出0xA