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

待我称王封你为后i 2024-05-23 22:04 58阅读 0赞

一。注意要点

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

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

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

二。C#

先看一个常见代码:

  1. public static String Md5Hash(String str)
  2. {
  3. MD5 md = MD5.Create();
  4. byte[] bytes = Encoding.UTF8.GetBytes(str);
  5. byte[] buffer2 = md.ComputeHash(bytes);
  6. string rst = "";
  7. //小写的 x2 是16进制小写。大写 X2 是转16进制大写。
  8. for (int i = 0; i < buffer2.Length; i++)
  9. {
  10. rst = rst + buffer2[i].ToString("x2");
  11. }
  12. return rst;
  13. }

解析:

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

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

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

调用这个方法:

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

看下结果:

md5 hash 16进制小写:025fceab9418be86066b60a71bc71485

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

  1. public static String Md5HashUpper(String str)
  2. {
  3. MD5 md = MD5.Create();
  4. byte[] bytes = Encoding.UTF8.GetBytes(str);
  5. byte[] buffer2 = md.ComputeHash(bytes);
  6. string rst = "";
  7. //小写的 x2 是16进制小写。大写 X2 是转16进制大写。
  8. for (int i = 0; i < buffer2.Length; i++)
  9. {
  10. rst = rst + buffer2[i].ToString("X2");
  11. }
  12. return rst;
  13. }

调用:

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

结果 :

md5 hash 16进制大写:025FCEAB9418BE86066B60A71BC71485

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

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

  1. public static String Md5HashBitConvert(String str)
  2. {
  3. MD5 md = MD5.Create();
  4. byte[] bytes = Encoding.UTF8.GetBytes(str);
  5. byte[] buffer2 = md.ComputeHash(bytes);
  6. string rst = BitConverter.ToString(buffer2);
  7. Console.WriteLine("BitConverter.ToString()之后原始值:" + rst);
  8. string rst2 = rst.Replace("-", "");
  9. Console.WriteLine("去掉减号‘-’后值:" + rst2);
  10. return rst2;
  11. }

运算结果:

BitConverter.ToString()之后原始值:02-5F-CE-AB-94-18-BE-86-06-6B-60-A7-1B-C7-14-85

去掉减号‘-’后值:025FCEAB9418BE86066B60A71BC71485

三。JAVA

  1. package org.example;
  2. import java.security.MessageDigest;
  3. public class HashUtil {
  4. public static String Md5Hash(String str) throws Exception
  5. {
  6. //默认UTF8
  7. byte[] byStr=str.getBytes();
  8. String rst="";
  9. // MessageDigest instance for MD5
  10. MessageDigest md = MessageDigest.getInstance("MD5");
  11. // Update MessageDigest with input text in bytes
  12. md.update(byStr);
  13. // Get the hashbytes
  14. byte[] hashBytes = md.digest();
  15. // Convert hash bytes to hex format
  16. StringBuilder sc = new StringBuilder();
  17. //小写的 x 是转16进制小写。
  18. for (byte b : hashBytes) {
  19. sc.append(String.format("%02x", b));
  20. }
  21. rst=sc.toString();
  22. return rst;
  23. }
  24. public static String Md5HashUpper(String str) throws Exception
  25. {
  26. //默认UTF8
  27. byte[] byStr=str.getBytes();
  28. String rst="";
  29. // MessageDigest instance for MD5
  30. MessageDigest md = MessageDigest.getInstance("MD5");
  31. // Update MessageDigest with input text in bytes
  32. md.update(byStr);
  33. // Get the hashbytes
  34. byte[] hashBytes = md.digest();
  35. // Convert hash bytes to hex format
  36. StringBuilder sc = new StringBuilder();
  37. //小写的 x 是转16进制小写。大写的 X 转为大写。
  38. for (byte b : hashBytes) {
  39. sc.append(String.format("%02X", b));
  40. }
  41. rst=sc.toString();
  42. return rst;
  43. }
  44. }

调用:

  1. public static void main( String[] args )
  2. {
  3. try {
  4. String md5HashInput="中华人民共和国";
  5. System.out.println( "MD5 HASH输入:" +md5HashInput);
  6. String md5HashOutput=HashUtil.Md5HashUpper(md5HashInput);
  7. System.out.println( "MD5 HASH输出:" +md5HashOutput);
  8. }catch (Exception ex)
  9. {
  10. System.out.println( "ex:"+ex.getMessage() );
  11. }
  12. System.out.println( "Hello ee!" );
  13. }
  14. }

发表评论

表情:
评论列表 (有 0 条评论,58人围观)

还没有评论,来说两句吧...

相关阅读

    相关 hashing (

    最近翻译一篇文章,发现了对Hashing的概念理解不清楚,特此说明如下: hashing 哈希值也叫做数据摘要,是通过哈希算法把文字处理后得到的数值,但是它比原文占用的