首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

【技术订正】用网上流传的“MD5模块”的千万要注意了

2013-04-09 
【技术勘误】用网上流传的“MD5模块”的千万要注意了!现在的MD5计算模块似乎有几种版本,但是,大部分(甚至包括A

【技术勘误】用网上流传的“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语句:


你自己也可以试试用(56字节)"12345678901234567890123456789012345678901234567890123456"计算,标准数据是49F193ADCE178490E34D1B3A4EC0064C,错误程序结果是29DC63DA78D43A804E8A4D4DCA707CC2

当使用文件函数时,因为问题二,导致长度等于64倍数的文件都会缺少一个字节进行MD5Transform,
即长度等于64倍数的文件也会触发BUG
因为与字符串计算用的是同一个出问题的MD5Final,所以,
集合法表示:文件BUG长度集合=字符串BUG长度集合∪{n∈Z|64n,1≤n}
【技术订正】用网上流传的“MD5模块”的千万要注意了

希望能加精~【技术订正】用网上流传的“MD5模块”的千万要注意了
警醒使用网络上流传该类代码的人,以免造成大家的损失。

(转自本人'ydm_bd'百度贴吧原文.http://tieba.baidu.com/p/2088917195)

发一个计算文件MD5,SHA1,CRC32的小工具( AAuto源码 ) - 可以用来比对正确的哈希值。

在IDE中新建文件粘贴下面的源码,然后按 F5 运行即可。               
AAuto最新版本下载 ( 仅 6.58MB,绿色不用安装,永久免费的桌面软件快速开发工具 )



不过看不懂啊
[解决办法]
一直都用搜的小工具来算,没想到还有这个坑儿~~~
[解决办法]
直接用C#的MD5类就OK了。网上很多C/C++的代码生成的结果和C#的不一样。


        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);
        }


[解决办法]
学习了,之前用过MD5。然后翻出来之前的代码,测试了一下,没有发现问题,呵呵。顶起、
[解决办法]

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

楼主,为何有标准的放着不用,非要用自已写的模块?
[解决办法]
百度的那两个我研究了大半天,没看懂,曾经的事

热点排行