我脑子里的东西告诉我,我在这里遗漏了一些明显的东西.
我正在将现有的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将正确的,但转换后的字符串是错误的.
例如,根据该网站,字符串"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
方法.
归档时间: |
|
查看次数: |
5792 次 |
最近记录: |