• (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通


    一。注意要点

    1:输入字符串的的编码双方保持统一,如:UTF8;

    2:HASH计算输出结果 byte[] 数组转String 时,编码要统一,如:转16进制小写字符串。当然也可以转Base64。

    3:如果是16进制字符串,双方大小写要统一。

     

    二。C#

    先看一个常见代码:

    复制代码
    public static String Md5Hash(String str)
            {
                MD5 md = MD5.Create();
                byte[] bytes = Encoding.UTF8.GetBytes(str);
                byte[] buffer2 = md.ComputeHash(bytes);
                string rst = "";
                //小写的 x2 是16进制小写。大写 X2 是转16进制大写。
                for (int i = 0; i < buffer2.Length; i++)
                {
                    rst = rst + buffer2[i].ToString("x2");
                }
                return rst;
            }
    复制代码

    解析:

    “MD5 md = MD5.Create();” 获取一个C# MD5对象。

    “byte[] bytes = Encoding.UTF8.GetBytes(str);”,将输入字符串用UTF8编码转为byte[] 数组,方便下一步给ComputeHash()方法计算。

    “rst = rst + buffer2[i].ToString("x2");”,拿到HASH结果后,逐字节转16进制小写。

    调用这个方法:

    string strOrg = "中华人民共和国";
                Console.WriteLine("md5 hash 16进制小写:"+ Md5Hash(strOrg));

    看下结果:

    md5 hash 16进制小写:025fceab9418be86066b60a71bc71485

    我们也可以将"x2"换成大写的“X2”,这样转出来16进制字符串为大写。

    复制代码
    public static String Md5HashUpper(String str)
            {
                MD5 md = MD5.Create();
                byte[] bytes = Encoding.UTF8.GetBytes(str);
                byte[] buffer2 = md.ComputeHash(bytes);
                string rst = "";
                //小写的 x2 是16进制小写。大写 X2 是转16进制大写。
                for (int i = 0; i < buffer2.Length; i++)
                {
                    rst = rst + buffer2[i].ToString("X2");
                }
                return rst;
            }
    复制代码

    调用:

    Console.WriteLine("md5 hash 16进制大写:" + Md5HashUpper(strOrg));

    结果 :

    md5 hash 16进制大写:025FCEAB9418BE86066B60A71BC71485

    还有另一个方法,可把byte[] 转为16进制:BitConverter.ToString().

    要注意,BitConverter.ToString(),转出来的16进制字符串,是带减号的“-”,返回最终结果时要去掉-。

    复制代码
    public static String Md5HashBitConvert(String str)
            {
                MD5 md = MD5.Create();
                byte[] bytes = Encoding.UTF8.GetBytes(str);
                byte[] buffer2 = md.ComputeHash(bytes);
                string rst = BitConverter.ToString(buffer2);
                Console.WriteLine("BitConverter.ToString()之后原始值:" + rst);
                string rst2 = rst.Replace("-", "");
                Console.WriteLine("去掉减号‘-’后值:" + rst2);
                return rst2;
            }
    复制代码

    运算结果:

    BitConverter.ToString()之后原始值:02-5F-CE-AB-94-18-BE-86-06-6B-60-A7-1B-C7-14-85
    去掉减号‘-’后值:025FCEAB9418BE86066B60A71BC71485

     

    三。JAVA

     

    复制代码
    package org.example;
    
    import java.security.MessageDigest;
    
    public class HashUtil {
        public static String Md5Hash(String str) throws Exception
        {
            //默认UTF8
            byte[] byStr=str.getBytes();
            String rst="";
            // MessageDigest instance for MD5
            MessageDigest md = MessageDigest.getInstance("MD5");
            // Update MessageDigest with input text in bytes
            md.update(byStr);
            // Get the hashbytes
            byte[] hashBytes = md.digest();
            // Convert hash bytes to hex format
            StringBuilder sc = new StringBuilder();
            //小写的 x 是转16进制小写。
            for (byte b : hashBytes) {
                sc.append(String.format("%02x", b));
            }
            rst=sc.toString();
            return rst;
        }
    
        public static String Md5HashUpper(String str) throws Exception
        {
            //默认UTF8
            byte[] byStr=str.getBytes();
            String rst="";
            // MessageDigest instance for MD5
            MessageDigest md = MessageDigest.getInstance("MD5");
            // Update MessageDigest with input text in bytes
            md.update(byStr);
            // Get the hashbytes
            byte[] hashBytes = md.digest();
            // Convert hash bytes to hex format
            StringBuilder sc = new StringBuilder();
            //小写的 x 是转16进制小写。大写的 X 转为大写。
            for (byte b : hashBytes) {
                sc.append(String.format("%02X", b));
            }
            rst=sc.toString();
            return rst;
        }
    }
    复制代码

     

     

    调用:

    复制代码
    public static void main( String[] args )
        {
            try     {
    
                String md5HashInput="中华人民共和国";
                System.out.println( "MD5 HASH输入:" +md5HashInput);
    
                String md5HashOutput=HashUtil.Md5HashUpper(md5HashInput);
    
                System.out.println( "MD5 HASH输出:" +md5HashOutput);
            }catch (Exception ex)
            {
                System.out.println( "ex:"+ex.getMessage() );
            }
    
            System.out.println( "Hello ee!" );
        }
    }
    复制代码

    运算结果:

    MD5 HASH输入:中华人民共和国
    MD5 HASH输出:025FCEAB9418BE86066B60A71BC71485

     

    没必要为了大小单独写一个方法,直接在 Md5Hash(strOrg) 方法后面加 ToUpper(),这里只是为了方便演示。

    Console.WriteLine("md5 hash 16进制大写2 :" + Md5Hash(strOrg).ToUpper());

     

  • 相关阅读:
    icu是哪个国家的域名?icu是什么域名?
    彻底搞懂vertical-align 底线、基线、中线的含义
    LLM研究之-NVIDIA的CUDA
    7.数组(一维数组、二维数组、C99中的变长数组、二分查找法)
    [PyTorch][chapter 62][强化学习-基本概念]
    CompletableFuture 和 Future 的选择,以及CompletableFuture的用法
    【设计模式-1】UML和设计原则
    IDEA运行thymeleaf的html文件打开端口为63342且连不上数据库
    今年的网络安全“体检”你做了吗?
    非关系型数据库Redis的安装【Linux】及常用命令
  • 原文地址:https://www.cnblogs.com/runliuv/p/16727630.html