MD5加密算法的编码坑

最近我们公司负责和一个三方公司进行接口联调,在参数请求的过程中为了安全我们采取了密文传输,而加密的方法我们采用了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编码,或者统一编码方法。


猜你喜欢

转载自blog.csdn.net/byy8023/article/details/80498689