2015-05-21 126 views
0

我在尝试计算XML文件的哈希MSD5时遇到了麻烦。 我有一个第三方验证器,它正确计算它,我想在c#中使自己的验证程序,但它不工作,我不断得到一个无效的散列MD5与大XML文件,小文件工作正常。大文件有大约63000行。创建XML文件的哈希MD5

在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(); 
    } 
+2

那么,有什么问题? –

+1

将您正在输入的字节分离为'ComputeHash',并将它们与您在Delphi程序中所做的对比。我们无法为您调试。 –

+0

C#的哈希值与验证器不同,当我尝试更小的文件时,它工作正常,没有大文件。 – fzuid

回答

0

首先,我会跟你不应该试图实现自己的安全方法,除非你知道自己在做什么的声明前言本。即使是最小的错误也会造成安全漏洞,使您的功能变得毫无价值。话虽如此,微软已将MD5功能构建到System.Security中。这里是一个更简单的方法来做到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,您可以增加可用于暴力破解的解决方案数量,并使预计算表需要大量存储空间,但计算速度仍然很快,并且存储被视为“便宜”。

+0

没有工作,只是读一些关于字符串生成器的最大大小... https://msdn.microsoft.com/en-us/library/system.text.stringbuilder.maxcapacity%28v=vs.110%29。 aspx – fzuid

+0

巴西政府规定散列必须是MD5 ......不能改变。 – fzuid

+0

它必须在实际散列之前或之中,因为在md5中存在截断并且输出将只有32个字符。从我读过的默认最大容量与Int32相同,即2,147,483,647。每个字符都是8位,因此如果要序列化它以便使用,则您的xml需要少于268,435,455个字符。它不应该有最大尺寸的问题,否则。 – Bob

-1

如果你想要一个MD5哈希,你可以简单地做到这一点,但它看起来像有一些其他的东西与你想什么事情。例如,您调用.GetHashCode()并考虑MD5哈希,但.GetHashCode()不是MD5哈希。

如果您使用.GetHashCode(),你可能也切断所有的MD5的东西了,只是这样做:

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

然而,.GetHashCode()是.NET专用的,所以它止跌德尔菲计划不会转化为同等价值。

否则,对于真正的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(); 
} 

编辑:

从刷卡还有一个1行版本(若有人在未来的好奇)。

FormsAuthentication.HashPasswordForStoringInConfigFile(string, "MD5"), 
+0

我以前试过这个函数,它一直返回错误的散列。 – fzuid

+0

我开始认为这是语言的限制也许... – fzuid

+0

修改为将输入更改为xml –