使用javascript和PHP生成相同的MD5

时间:2013-06-24 19:32:57

标签: php javascript md5 filereader

我正在尝试构建一个需要比较任何文件的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哈希,请选择它。

提前致谢!

2 个答案:

答案 0 :(得分:1)

http://membres-liglab.imag.fr/donsez/cours/exemplescourstechnoweb/js_securehash/

javascript md5和php md5两者都相同,但我们需要使用一些函数......我们可以从上面的url中获取这些函数....

答案 1 :(得分:0)

我建议快速进行健全性检查:让客户端代码报告二进制数据的第一个和最后一个字节。在PHP代码中重复一遍。比较两种方法的第一个和最后一个字节,以确保它们实际上读取相同的数据(这应该导致相同的MD5散列。)

然后我建议在这里发布代码,以便我们进行审核。