一、概念:
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 == 16) return tmp.ToString().A(8, 16); else if (bit == 32) 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 = 0; 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 = 0; i < targetData.Length; i++) { //這個是很常見的錯誤,你字節轉換成字符串的時候要保證是2位寬度啊,某個字節為0轉換成字符串的時候必須是00的,否則就會丟失位數啊。不僅是0,1~9也一樣。 //byte2String += targetData[i].ToString("x");//這個會丟失 byte2String = byte2String+ targetData[i].ToString("x2"); } return byte2String; }