创建 XML 文件的哈希 MD5
Creating a hash MD5 of a XML File
我在尝试计算 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();
}
如果您想要 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();
}
编辑:还有一个单行版本(如果以后有人好奇的话)。
FormsAuthentication.HashPasswordForStoringInConfigFile(string, "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,您可以增加暴力破解的可能解决方案数量,并使其需要大量存储空间来存储预先计算的表,但计算速度仍然很快,存储空间被认为是 "cheap".
我在尝试计算 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();
}
如果您想要 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();
}
编辑:还有一个单行版本(如果以后有人好奇的话)。
FormsAuthentication.HashPasswordForStoringInConfigFile(string, "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,您可以增加暴力破解的可能解决方案数量,并使其需要大量存储空间来存储预先计算的表,但计算速度仍然很快,存储空间被认为是 "cheap".