MessageDigest MD5算法没有返回我期望的内容

eri*_*ric 7 java md5

我脑子里的东西告诉我,我在这里遗漏了一些明显的东西.

我正在将现有的java项目与第三方api集成,后者使用api密钥的md5哈希进行身份验证.它对我不起作用,在调试过程中我意识到我生成的哈希值与它们提供的示例不匹配.我发现一些网站用字符串创建MD5哈希来检查他们的例子,据我所知,我错了,他们是对的.

例如,根据该网站,字符串"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());
}
Run Code Online (Sandbox Code Playgroud)

上周,我使用一种非常类似的方法使用SHA1算法成功验证了不同的API.我想知道如果这个问题是关系到org.apache.commons.net.util.Base64.encodeBase64String ...任何帮助是极大的赞赏,如果只是一些测试,看看是否ByteArray将正确的,但转换后的字符串是错误的.

rua*_*akh 9

例如,根据该网站,字符串"hello"生成散列"5d41402abc4b2a76b9719d911017c592".(FWIW我对这个网站一无所知,只是它似乎正确地散列了我的例子).当我通过我的代码运行它时,我得到:

XUFAKrxLKna5cZ2REBfFkg ==

两者都是表示相同的16字节散列的正确方法.5d41402abc4b2a76b9719d911017c592将散列的每个字节表示为两个十六进制数字,而XUFAKrxLKna5cZ2REBfFkg==使用Base-64 将散列的每三个字节表示为四个字符.

要生成此第三方API所期望的十六进制版本,您可以更改此设置:

Base64.encodeBase64String(md.digest());
Run Code Online (Sandbox Code Playgroud)

对此:

String.format("%032x", new BigInteger(1, md.digest()));
Run Code Online (Sandbox Code Playgroud)

(主要取自StackOverflow的答案).

但是,您可能需要考虑使用外部库.在上面的评论中,Perception提到了Apache Commons DigestUtils.如果你使用它,你会想要这个md5hex方法.