【MD5加密】MD5加密編碼的坑


MD5

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用於確保信息傳輸完整一致。

是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD5實現。將數據(如漢字)運算為另一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD2、MD3和MD4。

API驗簽

簽名時,根據參數名稱,將除簽名(sign)外所有請求參數按照字母先后順序排序: key + value .... key + value 。
注:
1、排序若首字母相同,則對第二個字母進行排序,以此類推。
2、value無需編碼。
3、對於非必選參數,如果沒有value值,也參與簽名。(說明:非必選參數沒有value值時,將參數名放到字符串中,即參數名要參加簽名)
例如:將“foo=1,bar=2,baz=三”排序為“bar=2,baz=三,foo=1”參數名和參數值鏈接后,得到拼裝字符串bar2baz三foo1。
4、在傳入參數有數組時,比如 cartypelist [1,2] 則: 簽名:cartypelist1,2

簽名算法

將分配的得到的密鑰(SecretKey)接到參數字符串尾部進行md5加密,再轉化成大寫,
格式是:md5(key1value1key2value2...Secret)。

由於在使用MD5加密的過程中發現兩種加密算法生成的MD5值竟然不一樣

算法一,推薦

        public static string GetMd5String(string source)
        {
            MD5 mD = MD5.Create();
            UTF8Encoding uTF8Encoding = new UTF8Encoding();
            byte[] bytes = uTF8Encoding.GetBytes(source);
            byte[] array = mD.ComputeHash(bytes);
            StringBuilder stringBuilder = new StringBuilder();

            byte[] array2 = array;
            for (int i = 0; i < array2.Length; i++)
            {
                byte b = array2[i];
                stringBuilder.Append(b.ToString("x2"));
            }
            return stringBuilder.ToString();
        }

算法二

        /// <summary>
        /// 獲得32位的MD5加密
        /// </summary>
        /// <param name="input">輸入字符串</param>
        /// <returns>返回值</returns>
        public static string GetMD532(string input)
        {
            MD5 md5 = MD5.Create();
            byte[] data = md5.ComputeHash(Encoding.Default.GetBytes(input));
            var sb = new StringBuilder();
            for (int i = 0; i < data.Length; i++)
            {
                sb.Append(data[i].ToString("x2"));
            }
            return sb.ToString();
        }

由於編碼不同,一個是UTF8編碼,一個是默認編碼,導致有漢字的時候,會產生不同的加密結果。

所以建議在有漢字的消息編碼里對漢字進行Unincode編碼,或者統一編碼方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM