【问题标题】:Generate the same MD5 using javascript and PHP使用 javascript 和 PHP 生成相同的 MD5
【发布时间】:2013-06-24 19:32:56
【问题描述】:

我正在尝试构建一个需要比较任何文件的 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),最后我只能看到一个差异。

PHP: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 哈希,请使用它。

提前致谢!

【问题讨论】:

  • 是的,我也试过这个实现。它生成相同的哈希值。我想我遗漏了一些与文件内容的编码有关的东西。
  • 只是为了检查一下,您没有将 md5 用于任何与安全相关的事情,是吗?
  • 不,我不是。不用担心。 :)

标签: php javascript md5 filereader


【解决方案1】:

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

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

【讨论】:

  • 不鼓励仅链接答案,部分原因是链接最终可能会损坏,导致答案无用。请提供链接中的一些上下文。
  • 我必须加 1,因为链接的 javascript 实现是唯一一个给我与二进制数据 PHP 相同的结果(尝试 PhpJs、CryptoJs 和其他一些),谢谢你保存我的天。
  • 这里相同,输出完全相同,感谢 Ramakanth!
【解决方案2】:

我建议做一个快速的完整性检查:让您的客户端代码报告二进制数据的第一个和最后一个字节。在您的 PHP 代码中重复。比较两种方法的第一个字节和最后一个字节,以确保它们实际上正在读取相同的数据(这应该会产生相同的 MD5 哈希值。)

那么我建议在这里发布代码以便我们审查。

【讨论】:

  • 嗨,我尝试了以下方法:获取每个字符并打印 unicode 编号。最后只有一个区别。我使用了一些不同的 Pdf,并使用 vimdiff 进行了验证。 PHP:102 10 49 48 49 53 49 10 37 37 69 79 70 0 Javascript:102 10 49 48 49 53 49 10 37 37 69 79 70 现在我有点困惑:string.length 在 JS 和php。还尝试将“String.fromCharCode(0)”附加到 JS 内容的末尾,但没有成功。编辑:不能使 2 个空格换行工作...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2021-04-11
  • 2011-02-24
  • 2015-09-23
  • 1970-01-01
相关资源
最近更新 更多