【问题标题】:MessageDigest MD5 Algorithm not returning what I expectMessageDigest MD5 算法没有返回我所期望的
【发布时间】:2012-11-19 01:31:40
【问题描述】:

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

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

例如,根据this website,字符串“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 是否正确但转换后的字符串错误,则非常感谢任何帮助.

【问题讨论】:

  • md.digest() 应该包含您正在寻找的字节,您使用 Base64 算法对它们进一步编码并获得不同的结果
  • 我需要将这些字节转换为一个字符串以进行 http 请求,有没有更好的方法来做到这一点?
  • 新字符串(byte[] bytes)
  • 我猜的问题是在不同的文本编码stackoverflow.com/questions/6839969/…
  • 如果您可以选择使用外部库,Apache Commons DigestUtils 将为您创建 MD5 哈希,并已在众多应用中经过实战测试。

标签: java md5


【解决方案1】:

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

XUFAKrxLKna5cZ2REBfFkg==

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

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

Base64.encodeBase64String(md.digest());

到这里:

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

(主要取自this StackOverflow answer)。

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

【讨论】:

  • 将其标记为正确,因为它解决了我的问题,解释了到底发生了什么,并参考了 Perception 的使用 DigestUtils 的建议(也适用)。谢谢!
【解决方案2】:

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<byteData.length;i++) {
            String hex=Integer.toHexString(0xff & byteData[i]);
            if(hex.length()==1) hexString.append('0');
            hexString.append(hex);
        }
        return hexString.toString();
    }
    catch(java.security.NoSuchAlgorithmException missing) {
        return "Error.";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2021-12-11
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多