【算法】MD5加密算法

      今天在项目中遇到了一个加密需求,参考之前“油菜花”系统里的接口文档,自己尝试了一把Sign(签名串)算法的实现过程。

       先介绍签名串生成算法:

       1、将所有请求参数(除去Sign)转为小写;

       2、再按照a-z的顺序进行排序顺序拼接(如果两个参数名首字母一样,则对第二个字母进行排序);

       3、拼接结果为:字段名(小写) + 字段值 + 字段名(小写) + 字段值。。。其中值不用转换大小写

       4、如果为null则取“”空,如果值为一个类或者数组,则值为这个类或者数组的Json格式。

       例如:

      appidWXSCbussineidE9MDSF-FEF7-0FEFSgoodstype0guestmobileguestnameleagueid606035A8-1763orderitem[{"GoodsID":"07BA43E0-c92c-438f-956b-a4f40108a014","GoodsPrice":200}]

       5、将私钥加到所得到的字符串前与字符串后:假设私钥为abc

      abcappidWXSCbussineidE9MDSF-FEF7-0FEFSgoodstype0guestmobileguestnameleagueid606035A8-1763orderitem[{"GoodsID":"07BA43E0-c92c-438f-956b-a4f40108a014","GoodsPrice":200}]abc

       6、对上述字符串进行MD5加密。

       7、加密后对所得到的签名转为大写。

       8、将这个签名赋值给Sign请求参数,并和其他所需的请求参数,一起POST到指定接口。

      通过以上步骤即可完成“Sign签名串”的功能实现,其中对于排序、大小写转换都还熟悉,参考网上资料以及api文档都能够解决,对于MD5加密,还是第一次接触。

      代码展示如下:     

<span style="font-family:Microsoft YaHei;font-size:14px;">using System;
usingSystem.Collections.Generic;
using System.Linq;
usingSystem.Security.Cryptography;
using System.Text;
usingSystem.Threading.Tasks;
 
namespace MD5Test
{
    class Program
    {
        static void Main(string[] args)
        {
            PwdEncrypt("123");
        }
 
        public static string PwdEncrypt(stringpwd) // MD5加密密码.....
 
        {
            MD5 md5 = newMD5CryptoServiceProvider();
            //获取传入字符的ASCII码
            byte[] data =System.Text.Encoding.Default.GetBytes(pwd);
                            //进行哈希转换
            byte[] md5data =md5.ComputeHash(data);
 
            md5.Clear();
            string Str = "";
            for (int i = 0; i <md5data.Length; i++)
            {
                //先将10进制转换为16进制;字符串长度是否大于2位,不满足补0--防止空串。
                Str +=md5data[i].ToString("x").PadLeft(2, '0');
            }
            return Str;
           
        }
    }
}</span>
       1、实例化对象newMD5CryptoServiceProvider(), ,此时当然要引用System.Security.Cryptography命名空间,从而实现加密对象的引用;

       2、以字节数组的形式,获取每一个字母的ASCII码(10进制);

       3、通过newMD5CryptoServiceProvider类的一个ComputerHash方法,将上述的十进制数组转化,算是一层加密;

       4、循环该字节数组,将其转化为16进制(.ToString("x"))的值,同时拼接到字符串上,也可以是32进制。

       5、将其return,则为加密后的字符串。

       注意:.PadLeft(2,"0")是说如果此时md5data[i]的位数小于2位,左侧补充2个’0’。

       
      需要注意,MD5加密是不可逆的,通过实现这个Sign签名串,发现(1)字段名小写,字段值不小写的时候,就会通过获取ASCII码加密一次;(2)进行哈希转换,随机又加密一次,两次加密,从而实现加密不可逆。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值