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

   2023-02-09 学习力0
核心提示:一。注意要点1:输入字符串的的编码双方保持统一,如:UTF8;2:HASH计算输出结果 byte[] 数组转String 时,编码要统一,如:转16进制小写字符串。当然也可以转Base64。3:如果是16进制字符串,双方大小写要统一。 二。C#先看一个常见代码:public static St

一。注意要点

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

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 使用C#编写一个.NET分析器(一) 使用csv模块的什么方法可以一次性将一行数据写入文件
    使用C#编写一个.NET分析器(一) 使用csv模块的
    译者注这是在Datadog公司任职的Kevin Gosse大佬使用C#编写.NET分析器的系列文章之一,在国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断)、IDE、诊断工具中,比如Datadog的APM,Visual Studio的分析器以及Rider和Reshaper等等。之前
    03-08
  • 跨语言调用C#代码的新方式-DllExport 跨语言调用本质
    跨语言调用C#代码的新方式-DllExport 跨语言调
    简介上一篇文章使用C#编写一个.NET分析器文章发布以后,很多小伙伴都对最新的NativeAOT函数导出比较感兴趣,今天故写一篇短文来介绍一下如何使用它。在以前,如果有其他语言需要调用C#编写的库,那基本上只有通过各种RPC的方式(HTTP、GRPC)或者引入一层C++
    03-08
  • 我比较了 Go 和 C# 的速度
    我比较了 Go 和 C# 的速度
    我在 Go 和 C# 之间进行了速度比较。我通常使用 C#,但我有机会使用 Go,并且由于传闻 Go 速度很快,所以我实际测量了它。测量内容我在 Go 和 C# 中执行了一个简单的循环和判断过程,以查看整数 2 到 N 是否为质数。来源是Github参考。测量模式 逻辑内核 8 Wi
    03-08
  • [C#]使用 AltCover 获得代码覆盖率 - E2E Test 和 Unit Test
    [C#]使用 AltCover 获得代码覆盖率 - E2E Test
    背景在 CI/CD 流程当中,测试是 CI 中很重要的部分。跟开发人员关系最大的就是单元测试,单元测试编写完成之后,我们可以使用 IDE 或者 dot cover 等工具获得单元测试对于业务代码的覆盖率。不过我们需要一个独立的 CLI 工具,这样我们才能够在 Jenkins 的 CI
  • C#中LINQ的Select与SelectMany函数如何使用 c反应蛋白高说明什么
    C#中LINQ的Select与SelectMany函数如何使用 c反
    本篇内容主要讲解“C#中LINQ的Select与SelectMany函数如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中LINQ的Select与SelectMany函数如何使用”吧!LINQ的Select与SelectMany函数使用Select扩展函
    02-09 linqselect
  • PerfView专题 (第三篇):如何寻找 C# 中的 VirtualAlloc 内存泄漏
    PerfView专题 (第三篇):如何寻找 C# 中的 Virt
    一:背景上一篇我们聊到了如何用 PerfView 去侦察 NTHeap 的内存泄漏,这种内存泄漏往往是用 C 的 malloc 或者 C++ 的 new 分配而不释放所造成的,这一篇我们来聊一下由 VirtualAlloc 方法造成的泄漏如何去甄别?了解 VirtualAlloc 的朋友肯定说, C# 这种高
    02-09
  • Blazor和Vue对比学习(知识点杂锦3.04):Blazor中C#和JS互操作(超长文)
    Blazor和Vue对比学习(知识点杂锦3.04):Blazo
    C#和JS互操作的基本语法是比较简单的,但小知识点特别多,同时,受应用加载顺序、组件生命周期以及参数类型的影响,会有比较多坑,需要耐心的学习。在C#中调用JS的场景会比较多,特别是在WASM模式下,由于WebAssembly的限制,很多时候,还是需要借助JS去控制D
    02-09
  • 的键">C#怎么使用struct类型作为泛型Dictionary
    本文小编为大家详细介绍“C#怎么使用struct类型作为泛型DictionaryTKey,TValue的键”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么使用struct类型作为泛型DictionaryTKey,TValue的键”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学
  • C#如何实现折半查找算法 彩票查询
    C#如何实现折半查找算法 彩票查询
    本篇内容主要讲解“C#如何实现折半查找算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#如何实现折半查找算法”吧!折半查找,也叫二分查找,当在一个数组或集合中查找某个元素时,先定位出中间位置元素
    02-09
  • C#如何实现选择排序 c罗
    C#如何实现选择排序 c罗
    本篇内容主要讲解“C#如何实现选择排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#如何实现选择排序”吧!选择排序是一种低效的排序算法,大致过程是:遍历数组的每一个元素,先假设0号位置上的元素是最
    02-09
点击排行