MD5公開的算法,任何語言實現後都一樣,通用的;
不可逆加密:原文--加密--密文,密文無法解密出原文;
相同原文加密的結果是一樣的;
不同長度的內容加密後都是32位;
不管文件多大,都能產生32位長度摘要;
用途:
1.防篡改(比對密文,判斷是否修改過 例如:git)
2.密碼保存,防止看到明文(登錄時比對密文,加鹽)
3.防止抵賴,數字簽名。
code:
/// <summary> /// 對字符串加密 /// </summary> /// <param name="sourse">字符串</param> /// <param name="length">位數</param> /// <returns></returns> public async Task<string> Encrypt(string sourse, int length = 32) { if (string.IsNullOrEmpty(sourse)) return string.Empty; //得到一個加密對象(使用的MD5) HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm; byte[] bytes = Encoding.UTF8.GetBytes(sourse);//將字符串轉換爲byte數組 byte[] hashValue = provider.ComputeHash(bytes); var strBuilder = new StringBuilder(); switch (length) { case 16://16位密文是32位密文的9到24位字符 for (int i = 4; i < 24; i++) { //轉化爲小寫的16進制 strBuilder.Append(hashValue[i].ToString("x2")); } break; case 32: for (int i = 0; i < 16; i++) { strBuilder.Append(hashValue[i].ToString("x2")); } break; default: for (int i = 0; i < hashValue.Length; i++) { strBuilder.Append(hashValue[i].ToString("x2")); } break; } return strBuilder.ToString();//返回密文 } /// <summary> /// 獲取文件的MD5摘要 /// </summary> /// <param name="fileName">文件的絕對路徑</param> /// <returns></returns> public async Task<string> AbstractFile(string fileName) { //得到文件流 using (FileStream file = new FileStream(fileName, FileMode.Open)) { return await AbstractFile(file); } } /// <summary> /// 根據Stream獲取文件摘要 /// </summary> /// <param name="stream"></param> /// <returns></returns> public async Task<string> AbstractFile(Stream stream) { //創建一個MD5的對象 var md5 = new MD5CryptoServiceProvider(); //通過文件流獲得byte數組 byte[] retVal = md5.ComputeHash(stream); var strBuilder = new StringBuilder(); for (int i = 0; i < retVal.Length; i++) { strBuilder.Append(retVal[i].ToString("x2")); } return strBuilder.ToString(); }