因爲項目中要和php對接,要將一段字符串生成md5(16位)驗證碼,在英文字符時,沒有太大問題,但在遇到中文時,兩邊字條始終不一致。php
php是別人的項目,看不到源碼,網上一查,估計是這樣寫的:ide
<?php echo substr(md5("admin"),8,16); // 16位MD5加密 echo "<hr>"; echo md5("admin"); // 32位MD5加密 ?>
以前的 md5代以下(對md5沒有過多研究,這段代碼也是網上找的):oop
public static string Md5_16(string str) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(str)), 4, 8); t2 = t2.Replace("-", ""); t2 = t2.ToLower(); return t2; }
在苦惱之際,想到之前還有一種md5的作法,得出的值和php生成的一比對,是正確的。但如今4.5環境下警告該方法過時了ui
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower(); //32位 return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower().Substring(8, 16); //16位
本着認真負責的精神,再找找找(恰好也有時間),結果仍是在msdn上找到的一段代碼,只不過把 HashPasswordForStoringInConfigFile 這個方法從新實現了下加密
public static string GetMd5Hash(string input) { MD5 md5Hash = MD5.Create(); // Convert the input string to a byte array and compute the hash. byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input)); // Create a new Stringbuilder to collect the bytes // and create a string. StringBuilder sBuilder = new StringBuilder(); // Loop through each byte of the hashed data // and format each one as a hexadecimal string. for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } // Return the hexadecimal string. return sBuilder.ToString(); }
來源連接:https://social.msdn.microsoft.com/Forums/zh-TW/590bd6a8-57d7-4041-81da-80fe8b832b77/md5spa