【问题标题】:How to consistently Generate correct SHA-384 hash strings in Java如何在 Java 中始终如一地生成正确的 SHA-384 哈希字符串
【发布时间】:2018-11-21 22:59:51
【问题描述】:

我正在尝试生成文件,然后对其内容进行散列,并将该散列附加到文件内容的末尾。因为我使用的是 SHA-384,我的哈希函数代码粘贴在下面。问题在于生成正确的哈希字符串不一致,因此哈希和文件内容对于某些文件最终无效(不匹配),而对其他文件有效。我能做些什么来解决这个问题吗?我正在使用第三方应用程序来读取和验证文件,因此很遗憾我无法获得它们的解码功能。

public static String hash384(byte[] inputBytes) throws Exception{
        try {
            Runtime.getRuntime().gc();
            String hash;
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-384");
            messageDigest.update(inputBytes);
            byte[] digestedBytes = messageDigest.digest();
            hash = new String(digestedBytes, "windows-1251");
            return hash;
        } catch(Exception e) {
            e.printStackTrace();
        }
        return null;
    }

【问题讨论】:

  • 您的问题可能来自您用于将字节转换为字符串的字符集编码,请尝试改用 UTF-8
  • 感谢您的贡献,我曾尝试使用 UTF-8,但它会将字符分成小于 48 个字符,我使用该字符 (windows-1251) 的原因是因为它给了我解码应用程序所需的 48 个字符散列..
  • 你为什么要转换成String?摘要是二进制数据,而不是文本。它的原始形式不太适合表示为 String,而您已经有一个很好的 byte[] 表示形式可以返回。
  • 另外,您的方法的输入有点可疑。首先,它要求您将文件的全部内容保存在该数组的内存中。如果您必须处理大文件,那将是非常重量级的。此外,尚不清楚您实际上是如何获得这些输入字节的。您确定它们完全匹配目标文件的完整内容,逐字节吗?
  • 输入是长文本,至少有 300 个字符长,但可以扩展到更多,我通过 String.getBytes() 将字符串转换为字节,因此我得到字节作为输入数据。预期的输出应该是这样的: (h'6†¥ª,ÿ¦áŽ ‰ÇKåqöØ«ltq®Ð¸]

标签: java spring-mvc spring-boot security hashcode


【解决方案1】:

我建议使用 Apache 的 commons-codec 模块中的 DigestUtils,这样就可以编写两行代码:

import static org.apache.commons.codec.digest.MessageDigestAlgorithms.SHA_384;
...
// digest
byte[] digest = new DigestUtils(SHA_384).digest(new File(<file path>));
// hex digest
String hdigest = new DigestUtils(SHA_384).digestAsHex(new File(<file path>));

【讨论】:

  • 由于 OP 说他有时会得到想要的结果,我认为他不太可能试图获得十六进制表示。他的原始代码永远不会这样做。
  • 答案已更新以适应非十六进制表示。
  • @IllyaKysil 最后一个选项返回一个 96 个字符的字符串,知道如何将它降低到 48 个吗?非常感谢!
  • 两种方法 - digestdigestHex 计算相同的值,但表示方式不同。 digestHexdigest 的结果的每个字节表示为两个十六进制数字,每个字节 2 位,总共 96 位。将其降低到 48 bytes 的唯一方法是执行反向转换。但是您已经拥有该数据 - 这是digest 的结果。只需跳过new String(digestedBytes, "windows-1251");,因为并非所有字节都可以表示为指定编码中的字符
猜你喜欢
  • 2021-01-01
  • 2011-03-07
  • 2017-09-20
  • 2012-03-07
  • 2013-10-07
  • 2011-11-02
  • 2012-11-14
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多