(程式語言界的丐幫 C#).NET MD5 HASH 雜湊 加密 與JAVA 互通

2022-09-25 15:01:13

一。注意要點

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());