【问题标题】:Javascript md5 hash of image to compare with Java用于与 Java 比较的图像的 Javascript md5 哈希
【发布时间】:2013-07-05 02:01:29
【问题描述】:

我从 javascript 得到一个不同的哈希值,然后我从 java 得到......我希望有人能解释并帮助纠正这个问题。

历史 我正在尝试从移动应用程序连接到第三方。我不得不将他们的 java api 重写为 javascript,这会导致一些翻译问题。其中一个问题是他们期望图像的数据数组和该图像的 md5 哈希值进行比较。在 Java 中,当我使用他们的代码时,我得到的哈希值与在 javascript 中执行相同操作时不同。

在java中,代码:

byte[] decodedString = Base64.decode(testimg,  Base64.DEFAULT);

MessageDigest md = MessageDigest.getInstance("MD5");
md.reset();
md.update(decodedString);

byte[] array = md.digest();

创建一个散列:ad5e3cdf9174167243ded0e329a37cf6

同样的事情在 javascript 中给出:8bd54f4d1c4800e3df9cdd2aee728ded

var decodedstr = window.atob(testimg);
var hashString = MD5(decodedstr);

在 javascript 中,我不能像使用 java 一样传递字节数组,但字节值应该相同(尽管 java 将这些显示为无符号)

如何在 javascript 中更改我的图像数组以创建相同的散列并仍然具有正确的图像?

【问题讨论】:

  • “this 的字节值”是什么意思?哈希给出了一个字节数组,而不是单个字节。请出示您的 Java 代码。请注意,将字符串转换为字节需要编码 - 您绝对不应该将其用于 image 转换。图片不是文字——不要把它们当成文字来对待。
  • 扩展上一条评论。字节和字符之间没有一对一的关系,所以像这样的陈述:“我的测试图像中的第一个字节是'ÿ'”甚至没有意义。编码该字符或任何字符的一个或多个字节取决于您使用的字符编码(ASCII、UTF-8、UTF-16、ShiftJS 等)。
  • 谢谢,已将我的查询更改为希望更清楚一点。我正在使用 base64 图像,然后将其解码为字节数组。通过查看每个数组,它们基本上是相同的(尽管 java 显示为无符号。javascript MD5 算法倾向于只接受字符串而不是数组,所以通过使用 atob 我假设这会将图像解码为可用字符串,因为在执行 charcodeat结果字符串与 java 数组匹配(尽管已签名)。对不起,如果我混淆了这个问题。
  • 更新后,java 代码现在看起来没问题。 javascript似乎很可疑。 developer.mozilla.org/en-US/docs/Web/API/window.atob 说 atob 是“用于 Unicode 或 UTF-8 字符串”,这意味着它将分配 javascript var“decodedstr”而不是字节,而是 UTF-8 字符——如前所述,给定创建的 UTF-8 字符从 arbitrary/image 字节没有办法回到相同的字节。
  • 假设 testimg 的内容确实代表图像的字节,那么你要做的就是调用 MD5(testimg),跳过将图像字节转换为字符串。

标签: java javascript md5


【解决方案1】:

终于明白了!谢谢你们的帮助和cmets。对于其他偶然发现此问题的人:最终在http://blog.faultylabs.com/?d=md5 找到了一个 MD5 脚本,这将允许我传入一个数组缓冲区并解决它。

或者至少,给了我想要的结果,听起来 JavaScript 需要更多的试验和错误,因为所有内容的处理方式都与其他语言略有不同。

再次感谢。

【讨论】:

  • 此链接现在已过期,您能否发布一个永久答案。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
相关资源
最近更新 更多