zoukankan      html  css  js  c++  java
  • 【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编码,或者统一编码方法。

  • 相关阅读:
    1130
    Oracle 数据库常用操作语句大全
    Oracle用sys登陆报:ORA-28009:connection as sys should be as sysdba
    导出数据报ORA-39002: 操作无效 ORA-39070: 无法打开日志文件。 ORA-39087: 目录名 DUMP_DIR 无效
    SGI STL源码stl_bvector.h分析
    SGI STL源码stl_vector.h分析
    CGI 萃取技术 __type_traits
    迭代器iterator和traits编程技法
    智能指针分析及auto_ptr源码
    C++深拷贝和浅拷贝细节理解
  • 原文地址:https://www.cnblogs.com/jhli/p/6737482.html
Copyright © 2011-2022 走看看