我在尝试计算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();
}
答案 0 :(得分:1)
首先,我将在声明中说明,除非您确切知道自己在做什么,否则不应该尝试实施自己的安全方法。即使是最小的错误也会产生安全漏洞,使您的功能毫无价值。话虽这么说,微软将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,您可以增加蛮力可能的解决方案数量,并使其需要大量存储用于预先计算的表,但计算仍然很快并且存储被认为是“便宜的”。
答案 1 :(得分:-1)
如果你想要一个MD5哈希,你可以简单地做到这一点,但看起来还有一些其他的事情继续你正在尝试的东西。例如,您正在调用.GetHashCode()并考虑MD5哈希,但.GetHashCode()不是MD5哈希。
如果您正在使用.GetHashCode(),您可以将所有MD5内容剪掉,然后执行此操作:
public string GenerateHash(string xml)
{
return xml.GetHashCode().ToString();
}
但是,.GetHashCode()是特定于.NET的,因此它不会使用Delphi程序转换为等效值。
否则,对于真正的MD5哈希,你可以这样做。
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"),