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

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

我正在将现有的java项目与第三方api集成,后者使用api密钥的md5哈希进行身份validation。 它对我不起作用,在调试过程中我意识到我生成的哈希值与它们提供的示例不匹配。 我发现一些网站用字符串创建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()); } 

上周,我使用一种非常类似的方法使用SHA1算法成功validation了不同的API。 我想知道问题是否与org.apache.commons.net.util.Base64.encodeBase64String有关…非常感谢任何帮助,如果只是一些测试,看看byteArray是否正确但转换后的字符串是错误的。

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

XUFAKrxLKna5cZ2REBfFkg ==

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

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

 Base64.encodeBase64String(md.digest()); 

对此:

 String.format("%032x", new BigInteger(1, md.digest())); 

(主要取自StackOverflow的答案 )。

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

md5哈希算法是核心Java API的一部分,因此不需要任何外部库。 这是我用MD5加密密码的方法。

 import java.security.MessageDigest; /** * Use to encrypt passwords using MD5 algorithm * @param password should be a plain text password. * @return a hex String that results from encrypting the given password. */ public static String encryptPassword(String password) { try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(password.getBytes()); byte byteData[] = md.digest(); StringBuffer hexString = new StringBuffer(); for (int i=0;i