【发布时间】: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