当前位置:首页 > C#教程 > C#高级

C# MD5 32位加密 UTF-8编码

项目开发过程中需要用到md5加密,最开始的使用使用加密方法:


public static string getmd5(string str)

{

    byte[] b = system.text.encoding.default.getbytes(str);

    b = new system.security.cryptography.md5cryptoserviceprovider().computehash(b);

    string ret = "";

    for (int i = 0; i < b.length; i++)

    {

       ret += b[i].tostring("x").padleft(2, '0');

    }

    return ret;

}

 

在一开始的测试过程中没有出现问题,后来传入的参数包含中文后,就出现问题了,经过排查返现encoding.default使用的是默认的编码:gb2312

所以改变加密方式:


public static string usermd5(string str)

        {

            string cl = str;

            string pwd = "";

            md5 md5 = md5.create();//实例化一个md5对像

            // 加密后是一个字节类型的数组,这里要注意编码utf8/unicode等的选择 

            byte[] s = md5.computehash(encoding.utf8.getbytes(cl));

            // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得

            for (int i = 0; i < s.length; i++)

            {

                // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(x)则格式后的字符是大写字符 

                pwd = pwd + s[i].tostring("x");

            }

            return pwd;

        }

但是在和对方测试过程中,发现我这边的md5加密编码,经常出现少一位或几位的问题;后来分析发现是 字符串格式符的问题, x 表示大写, x 表示小写, x2和x2表示不省略首位为0的十六进制数字;

比如:ox0a, 使用x== 0xa,  使用x2==0x0a

则改变方法最后的输出格式:


public static string usermd5(string str)

        {

            string cl = str;

            string pwd = "";

            md5 md5 = md5.create();//实例化一个md5对像

            // 加密后是一个字节类型的数组,这里要注意编码utf8/unicode等的选择 

            byte[] s = md5.computehash(encoding.utf8.getbytes(cl));

            // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得

            for (int i = 0; i < s.length; i++)

            {

                // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(x)则格式后的字符是大写字符 

                pwd = pwd + s[i].tostring("x2");

            }

            return pwd;

        }


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!