我脑后的某个东西告诉我,我在这里遗漏了一些明显的东西。
我正在将现有的 java 项目与第三方 api 集成,该第三方 api 使用 api 密钥的 md5 哈希进行身份验证。它对我不起作用,在调试过程中我意识到我生成的哈希值与他们提供的示例不匹配。我发现一些网站从字符串创建 MD5 哈希值来检查它们的示例,据我所知,我错了,他们是对的。
例如,根据这个网站 http://md5-hash-online.waraxe.us/,字符串“hello”生成哈希值“5d41402abc4b2a76b9719d911017c592”。 (FWIW 我对这个网站一无所知,除了它似乎正确地散列了我拥有的示例)。当我通过我的代码运行它时,我得到:
XUFAKrxLKna5cZ2REBfFkg==
这是我用来生成 md5 哈希/字符串的简单方法:
private String md5(String md5Me) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
md.reset();
md.update(md5Me.getBytes("UTF-8"));
return Base64.encodeBase64String(md.digest());
}
上周我使用了非常相似的方法,使用 SHA1 算法成功验证了不同的 API。我想知道问题是否与 org.apache.commons.net.util.Base64.encodeBase64String 有关...非常感谢任何帮助,如果只有一些测试来查看 byteArray 是否正确但转换后的字符串是错误的。
例如,根据该网站,字符串“hello”生成的哈希值为“5d41402abc4b2a76b9719d911017c592”。 (FWIW 我对这个网站一无所知,除了它似乎正确地散列了我拥有的示例)。当我通过我的代码运行它时,我得到:
XUFAKrxLKna5cZ2REBfFkg==
两者都是表示相同 16 字节散列的正确方法。5d41402abc4b2a76b9719d911017c592
将散列的每个字节表示为两个十六进制数字,而XUFAKrxLKna5cZ2REBfFkg==
使用 Base-64 来表示每个three哈希的字节为four人物。
要生成此第三方 API 所需的十六进制版本,您可以更改此设置:
Base64.encodeBase64String(md.digest());
to this:
String.format("%032x", new BigInteger(1, md.digest()));
(大部分取自这个 StackOverflow 答案 https://stackoverflow.com/q/923863/978917).
但是,您可能需要考虑为此使用外部库。洞察力 https://stackoverflow.com/users/680925/perception在上面的评论中,提到了 Apache Commons DigestUtils。如果你使用它,你会想要the md5hex method http://commons.apache.org/codec/apidocs/org/apache/commons/codec/digest/DigestUtils.html#md5Hex%28java.lang.String%29.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)