一、概念:
MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
二、C#使用MD5进行加密字符串
MD5的引用命名空间是System.Security.Cryptography;
1.固定返回固定长度字符串(16位或者32位)
/// <summary>
/// 用MD5加密字符串,可选择生成16位或者32位的加密字符串
/// </summary>
/// <param name="password">待加密的字符串</param>
/// <param name="bit">位数,一般取值16 或 32</param>
/// <returns>返回的加密后的字符串</returns>
public string MD5Encrypt(string password, int bit)
{
MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
byte[] hashedDataBytes;
hashedDataBytes = md5Hasher.ComputeHash(Encoding.GetEncoding("gb2312").GetBytes(password));
StringBuilder tmp = new StringBuilder();
foreach (byte i in hashedDataBytes)
{
tmp.Append(i.ToString("x2"));
}
if (bit == )
return tmp.ToString().A(, );
else
if (bit == ) return tmp.ToString();//默认情况
else return string.Empty;
}
2、加密字符串
/// <summary>
/// 用MD5加密字符串
/// </summary>
/// <param name="password">待加密的字符串</param>
/// <returns></returns>
public string MD5Encrypt(string password)
{
MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
byte[] hashedDataBytes;
hashedDataBytes = md5Hasher.ComputeHash(Encoding.GetEncoding("gb2312").GetBytes(password));
StringBuilder tmp = new StringBuilder();
foreach (byte i in hashedDataBytes)
{
tmp.Append(i.ToString("x2"));
}
return tmp.ToString();
}
3、标准的MD5加密32位小写的:
public static string GetMD5(string myString)
{
MD5 md5 = new MD5CryptoServiceProvider();
//byte[] fromData = System.Text.Encoding.Unicode.GetBytes(myString);
byte[] fromData = System.Text.Encoding.UTF8.GetBytes(myString);//
byte[] targetData = md5.ComputeHash(fromData);
string byte2String = null; for (int i = ; i < targetData.Length; i++)
{
byte2String += targetData[i].ToString("x");
} return byte2String;
}
如果用上面这个标准的会有一个问题,就是丢失位数,所以字节转换成字符串的时候要保证是2位宽度啊,某个字节为0转换成字符串的时候必须是00的,否则就会丢失位数啊。不仅是0,1~9也一样。
用以下代码就可以避免:
public static string GetMD5(string myString)
{
MD5 md5 = new MD5CryptoServiceProvider();
//byte[] fromData = System.Text.Encoding.Unicode.GetBytes(myString);
byte[] fromData = System.Text.Encoding.UTF8.GetBytes(myString);//
byte[] targetData = md5.ComputeHash(fromData);
string byte2String = null; for (int i = ; i < targetData.Length; i++)
{
//这个是很常见的错误,你字节转换成字符串的时候要保证是2位宽度啊,某个字节为0转换成字符串的时候必须是00的,否则就会丢失位数啊。不仅是0,1~9也一样。
//byte2String += targetData[i].ToString("x");//这个会丢失
byte2String = byte2String+ targetData[i].ToString("x2");
} return byte2String;
}