• 【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编码,或者统一编码方法。

  • 相关阅读:
    【转载】10个Web3D可视化精彩案例
    基于react的audio组件
    如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
    CSS3 用border写 空心三角箭头 (两种写法)
    浅谈微信小程序对于创业者,意味着什么?
    左手Cookie“小甜饼”,右手Web Storage
    css3中user-select的用法详解
    个人感觉一些比较有用的特效例子
    纯css模拟电子钟
    蓝桥杯 ALGO-2:最大最小公倍数
  • 原文地址:https://www.cnblogs.com/jhli/p/6737482.html
Copyright © 2020-2023  润新知