是否有现成的C#等同于Java的DigestUtils。md5Hex(String)?我的Java很生疏,但我可以说DigestUtils是Apache Commons Codec包的一部分,而md5Hex(String)方法基本上使用MessageDigest.getInstance(“MD5”)。
(一个相关的花絮,Java和C#代码都使用UTF8。)
在最简单的测试中,我排除了我正在使用的Java和C#算法之间的任何差异。这意味着我的问题在其他地方。但是,为了记录,这两段代码产生了相同的结果:(谢谢,Alex。)
爪哇:
private static void printMd5Hex(String data) {
System.out.println(DigestUtils.md5Hex(data));
}
C#:
private static void printMd5Hex(string data)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] dataHash = md5.ComputeHash(Encoding.UTF8.GetBytes(data));
StringBuilder sb = new StringBuilder();
foreach (byte b in dataHash)
{
sb.Append(b.ToString("x2").ToLower());
}
Console.WriteLine(sb.ToString());
}
为了正确关闭这个问题,我的问题的根源与Java代码中的错误有关,该错误用于创建被散列的“数据”的格式字符串。实质上:
string dataFormatString = "%1$s, %2$s, %3$s, %4$s, %5$s, %6$s, %7$s, %8$s, %9$s, %10$s, %11$s, %12s";
string dataToHash = String.Format(dataFormatString, ...);
问题是第12个参数。它缺少一个$,这意味着数据空间填充最小为12个字符,使用第一个参数作为要格式化的数据。可悲的是,编写这个错误的开发者不再在这里工作,从而使我无法将双手缠绕在他的喉咙上。
答案 0 :(得分:3)
你想在c#中计算md5吗?
System.Security.Cryptography.MD5CryptoServiceProvider x =
new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.UTF8.GetBytes(password);
bs = x.ComputeHash(bs);
System.Text.StringBuilder s = new System.Text.StringBuilder();
foreach (byte b in bs)
{
s.Append(b.ToString("x2").ToLower());
}
password = s.ToString();