我正在尝试构建一个需要比较任何文件的 MD5 哈希的应用程序。由于具体问题,在上传前必须在客户端生成MD5,上传后应用需要在服务器端进行校验。
我的第一种方法是在客户端使用 JavaScript 文件 API 和FileReader.ReadAs
函数。然后我使用这里找到的 MD5 算法:http: //pajhome.org.uk/crypt/md5/
服务器端,我会使用 PHP 的fopen
命令和md5
函数。
这种方法在使用简单的文本文件时效果很好。但是,当使用二进制文件(如一些jpg或pdf)时,客户端生成的MD5与服务器不同。使用md5sum
命令行工具我发现服务器 MD5 是正确的,并且问题发生在客户端。
我已经尝试过其他 MD5 API,但结果相同。我怀疑FileReader.ReadAs
函数加载文件内容的方式略有不同(我尝试了所有ReadAs
函数变体:文本、二进制等),但我不知道有什么区别。
我遗漏了一些东西,但不知道是什么,也许我需要在生成 MD5 之前以某种方式解码内容。
有小费吗?
编辑1:
我遵循了 optima1 给出的想法。获取每个字符并在 javascript 和 PHP 上打印 unicode 编号。在所有情况下(使用 vimdiff),我最后只能看到一个差异。
比索:54 51 10 37 37 69 79 70 0
Javascript:54 51 10 37 37 69 79 70
也许 PHP 的这个额外的零是某种“字符串结束”。在这两种情况下,二进制字符串具有相同的长度。在 JS 内容的末尾添加 String.fromCharCode(0) 并不能解决问题。我会继续调查。
如果我找不到解决方案,我将尝试通过连接这些字符码并使用它来构建 MD5 来构建一个巨大的字符串。这是一个废话解决方案,但现在可以使用,我只需要在 JS 字符串的末尾添加一个零......
编辑2:
感谢上帝!这个实现就像一个魅力:http ://www.myersdaily.org/joseph/javascript/md5.js
如果您需要从二进制文件生成 MD5 散列,那就去做吧。
提前致谢!