MD5不可逆加密

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();
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章