我们提供安全,免费的手游软件下载!
C#.NET与JAVA互通之MD5哈希V2024
配套视频:
要点:
1.计算MD5时,SDK自带的计算哈希(ComputeHash)方法,输入输出参数都是byte数组。就涉及到字符串转byte数组转换时,编码选择的问题。
2.输入参数,字符串转byte数组时,编码双方要统一,一般为:UTF-8。
3.输出参数,byte数组转字符串时,编码双方要统一,一般为:16进制字符串(注意大小写);也有人选择BASE64字符串。
4.如果你的MD5用于存储密码,最好要加盐。
5.MD5用于签名,常见的运算过程。
开整:
一、.NET 算MD5
1.常用.NET MD5 代码:
输出效果(小写x):
注意:.ToString("x2") 里面的x是小写,即输出16进制小写。
如果X是大写,则输出16进制大写字符串。代码如下:
输出效果(大写X):
如果不使用.ToString("x2") ,我们还可以使用BitConverter来转换为16进制字符串。
但BitConverter默认转出的字符串是大写并带“-”符号。代码如下:
BitConverter.ToString 默认输出效果:
我们BitConverter.ToString转小写,并不带“-”符号。代码如下:
效果:
二、JAVA MD5
JAVA 算MD5代码:
输出效果:
三、同一个字符串 .NET MD5 与 JAVA 是否一致
双方待哈希字符串都为“HelloWorld”,且转16进制小写。将.NET算得的结果,放到JAVA中进行比较:
效果:
四、MD5加盐
假设你的登录名为:HelloWorld,密码是:123456,密码用MD5 HASH后存储,未加盐,数据库被脱库,对方得到了HelloWorld对应的密码存储MD5值:e10adc3949ba59abbe56e057f20f883e。
对方就可以用撞库,即:计算从 100000 到 999999 之间的MD5 HASH值,每次算出MD5值后,与e10adc3949ba59abbe56e057f20f883e比对,如果相等,则反推出HelloWorld的密码。
代码模拟:
效果:
所谓加盐,就是将原始字符串的头部或尾部加上一段固定的字符串,然后再去算MD5值。大致代码如下:
效果:
不加盐:e10adc3949ba59abbe56e057f20f883e,加盐:6ff7189064eea9523e3814d440ec6adc,明显不一致。
如果你的密码加了盐,对方不仅要脱库,还要知道你的盐是多少,盐是如何拼接的,才能撞库出原密码。
五、常用MD5签名算法
.NET注意:对KEY排序时,无论是Array.Sort,还是SortedDictionary,必须要加 string.CompareOrdinal 参数,不然默认不区分大小写,和JAVA默认区分大小写的行为不一致,导致双方签名不一致。
运算过程:
1.准备一个键值对集合,
2.集合的键按ASCII 从小到大排序,
3.使用&和=拼接,
4.算MD5哈希,注意对方要求的大小写。
.NET代码:
HashUtil 工具类:
.NET效果:
JAVA代码:
JAVA 效果:
--END
热门资讯