创建XML文件的哈希MD5

本文关键字:哈希 MD5 文件 XML 创建 | 更新日期: 2023-09-27 17:50:27

我在试图计算XML文件的散列MSD5时遇到了麻烦。我有一个第三方验证器,正确地计算它,我试图在c#中制作我自己的验证器,但它不起作用,我一直得到一个无效的哈希MD5与大xml文件,小文件它工作得很好。这个大文件大约有63000行。

c#中的代码:
public string GenerateHash(string xml, string hashOrigin = null)
    {
        XDocument doc = XDocument.Parse(xml);
        StringBuilder sb = new StringBuilder();
        string pKeyEncode = doc.Root.Value;
        if (!string.IsNullOrEmpty(hashOrigin))
            pKeyEncode = pKeyEncode.Replace(hashOrigin, "");
        MD5CryptoServiceProvider _cs = new MD5CryptoServiceProvider();
        byte[] _bs = Encoding.GetEncoding("ISO-8859-1").GetBytes(pKeyEncode);
        _bs = _cs.ComputeHash(_bs);
        StringBuilder _s = new System.Text.StringBuilder();
        foreach (byte _b in _bs)
        {
            _s.Append(_b.ToString("x2").ToLower());
        }
        int a = _s.GetHashCode();
        return _s.ToString();
    }

创建XML文件的哈希MD5

首先,我要声明,除非您确切地知道自己在做什么,否则永远不要尝试实现自己的安全方法。即使是最小的错误也会造成安全漏洞,使您的函数变得毫无价值。也就是说,微软在System.Security中内置了MD5功能。下面是一种更简单的MD5方法:

var xmlBytes = new UnicodeEncoding().GetBytes(xmlAsString);
var hashedXmlBytes = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(xmlBytes);
var hashedString = BitConverter.ToString(hashedXmlBytes);
我不建议使用MD5,它在计算上不安全已经有一段时间了。如果这是学术性的,那么你可能没问题。否则,至少我建议将上述代码与"SHA512"一起使用,并首先进行腌制。目前推荐的算法实际上是bcrypt或PBKDF2。它们在一行中运行一定数量的时间(您可以设置),这意味着您可以强制散列占用一定数量的时间。这意味着人们强行使用或创建预先计算的表(彩虹表)将不得不等待一定的惩罚时间来计算每个值,从而大大提高了安全性。使用SHA512,你增加了暴力破解的可能解决方案的数量,并使它需要大量的存储来预先计算表,但计算仍然很快,存储被认为是"便宜的"。

如果您想要MD5散列,您可以简单地这样做,但是看起来您正在尝试的操作中还有其他一些东西正在进行。例如,你正在调用。gethashcode()并考虑MD5哈希值,但是。gethashcode()不是MD5哈希值。

如果你使用的是。gethashcode(),你不妨把所有MD5的东西都去掉,然后这样做:

public string GenerateHash(string xml)
{
   return xml.GetHashCode().ToString();
}

然而,. gethashcode()是。net特定的,所以它不会在Delphi程序中转换为等价的值。

否则,对于真正的MD5哈希,您可以这样做:

吧:http://blogs.msdn.com/b/csharpfaq/archive/2006/10/09/how-do-i-calculate-a-md5-hash-from-a-string_3f00_.aspx

public string GenerateHash(string xml)
{
  //you can potentially do something to standardize the format of the XML here.
  // step 1, calculate MD5 hash from input
  MD5 md5 = System.Security.Cryptography.MD5.Create();
  byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(xml);
  byte[] hash = md5.ComputeHash(inputBytes);
  // step 2, convert byte array to hex string
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i < hash.Length; i++)
  {
      sb.Append(hash[i].ToString("X2"));
  }
  return sb.ToString();
}

编辑:还有一个单行版本(如果将来有人好奇的话)。

FormsAuthentication.HashPasswordForStoringInConfigFile(string, "MD5"),