【发布时间】: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