当前位置: 首页 > 知识库问答 >
问题:

MessageDigest MD5算法没有返回我期望的结果

刘兴朝
2023-03-14

我脑海中的东西告诉我,我在这里错过了一些明显的东西。

我正在将一个现有的java项目与一个第三方api进行集成,该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());
}

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

共有2个答案

扶开诚
2023-03-14

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.";
    }
}
鲜于华容
2023-03-14

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

XUFAKrxLKna5cZ2REBfFkg==

5d41402abc4b2a76b9719d911017c592将哈希的每个字节表示为两个十六进制数字,而XUFAKrxLKna5cZ2REBfFkg==使用Base-64将哈希的每三个字节表示为四个字符。

要生成此第三方 API 所需的十六进制版本,您可以更改以下内容:

Base64.encodeBase64String(md.digest());

对此:

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

(主要取自这个StackOverflow答案)。

但是,您可能需要考虑为此使用外部库。感知,在上面的评论中,提到了Apache Shareons DigestUtils。如果您使用它,您将需要md5hex方法。

 类似资料:
  • 如果在表中插入了项,然后我编写了一个查询,例如,为什么结果不是按照我期望的顺序?

  • 我有一个测试网站功能的Node.js项目。它利用Webdriver.iov4和摩卡/柴。 我创建了一个函数,用于检查页面上是否存在超时1分钟的元素。如果元素存在,它应该返回。如果没有,它应该返回。 我使用相同的函数来测试页面上是否没有元素。在这种情况下,我希望函数返回。但是,函数不会返回false,而是抛出超时错误,并且既不返回也不返回。这很奇怪,因为我在try-catch子句的catch块中包含

  • 当我使用System.out.println静态方法时,下面的Java程序显示ArrayList中的所有元素。但是,当我在方法中返回列表时,它只显示ArrayList中的一个元素。我希望你能给我一些指点,让我知道你做错了什么:

  • 参考资料: http://blog.csdn.net/zouxy09/article/details/8537620 http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html 我的数据挖掘算法代码实现: https://github.com/linyiqun/DataMiningAlgorithm 介绍 em算法是一种迭代算法

  • 我已阅读此文档 所以我尝试了这个实验 它返回这个 我检查了我的值或@@DATEFIRST 它返回< code>7 那么,为什么我没有得到文件中描述的结果呢? 编辑 这是我在文档中看到的

  • 我想mock接受对象参数的方法。此对象参数是从动态创建的。不会返回预期的结果,尽管这两个对象具有相同的数据,但只是不同的哈希代码。 有没有什么方法来模拟方法,使它能够以预期的结果响应?