【技术勘误】用网上流传的“MD5模块”的千万要注意了!
现在的MD5计算模块似乎有几种版本,
但是,大部分(甚至包括ASP的版本)存在【文件MD5计算不正确】的现象。
经过我的仔细检查,其中网上流传甚广的两个能计算文件的版本是错误的。
问题发生在计算一些具有特定文件/字符串大小的时候,问题出现几率很高。
举几个例子(百度上随机抽选的)
问题版本1:MD5函数为【Md5_[File/String]_Calc】
http://hi.baidu.com/xlsdg/item/b72dbbbe6adb7f40ba0e12dd
问题版本2:MD5函数为【Digest[File/String]ToHexStr】
http://www.programfan.com/article/772.html
其实,他们的源头都是这一个Robert Hubley的版本
http://www.hackhome.com/InfoView/Article_106283.html
【错误一】
MD5Final函数的一个If语句:
static void Main(string[] args)
{
string str = "http://blog.csdn.net/MoreWindows";
Console.WriteLine(md5(str));
}
static public string md5(string str)
{
MD5 m = new MD5CryptoServiceProvider();
byte[] s = m.ComputeHash(UnicodeEncoding.UTF8.GetBytes(str));
return BitConverter.ToString(s);
}
Public Shared Function MD5(ByVal input As String, ByVal coda As Integer) As String
Dim md5Hasher As New MD5CryptoServiceProvider
Dim data As Byte() = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input))
Dim sBuilder As New StringBuilder
Dim i As Integer
If coda = 16 Then
For i = 4 To 11
sBuilder.Append(data(i).ToString("x2"))
Next i
Else
For i = 0 To 15
sBuilder.Append(data(i).ToString("x2"))
Next i
End If
Return sBuilder.ToString()
End Function