我正在尝试构建一个需要比较任何文件的MD5哈希的应用程序。 由于具体问题,在上传之前,MD5必须在客户端生成,上传后应用程序需要检查服务器端。
我的第一种方法是在客户端使用JavaScript File API和FileReader.ReadAs
函数。然后我使用此处的MD5算法:http://pajhome.org.uk/crypt/md5/
服务器端,我会使用PHP的fopen
命令和md5
函数。
使用简单的文本文件时,此方法可以正常工作。但是,当使用二进制文件(如某些jpg或pdf)时,客户端生成的MD5与服务器不同。使用md5sum
命令行工具我发现服务器MD5是正确的,问题发生在客户端。
我尝试了其他MD5 API,我发现了相同的结果。我怀疑FileReader.ReadAs
函数正在以稍微不同的方式加载文件内容(我已经尝试了所有ReadAs
函数变体:text,binary等等),但我无法弄清楚有什么区别。< / p>
我遗漏了一些东西,但不知道是什么,也许我需要在生成MD5之前以某种方式解码内容。
任何提示?
编辑1:
我遵循了optima1给出的想法。取出每个字符并在javascript和PHP上打印unicode编号。在所有情况下,我只能看到最后一个区别(使用vimdiff)。
PHP:54 51 10 37 37 69 79 70 0
Javascript:54 51 10 37 37 69 79 70
在PHP中,这个额外的零可能是某种“字符串结束”。在这两种情况下,二进制字符串具有相同的长度。将String.fromCharCode(0)添加到JS内容的末尾并不能解决问题。我会继续调查。
如果我找不到解决方案,我将尝试通过连接这些字符并使用它来构建MD5来构建一个巨大的字符串。这是一个垃圾解决方案,但现在将服务,我只需要在JS字符串的末尾添加零...
编辑2:
感谢上帝!这个实现就像一个魅力:http://www.myersdaily.org/joseph/javascript/md5.js
如果您需要从二进制文件生成MD5哈希,请选择它。
提前致谢!
答案 0 :(得分:1)
http://membres-liglab.imag.fr/donsez/cours/exemplescourstechnoweb/js_securehash/
javascript md5和php md5两者都相同,但我们需要使用一些函数......我们可以从上面的url中获取这些函数....
答案 1 :(得分:0)
我建议快速进行健全性检查:让客户端代码报告二进制数据的第一个和最后一个字节。在PHP代码中重复一遍。比较两种方法的第一个和最后一个字节,以确保它们实际上读取相同的数据(这应该导致相同的MD5散列。)
然后我建议在这里发布代码,以便我们进行审核。