0

我有需要在我的 java 客户端上计算和检查的 UTF-8 hash_file 的输出。根据hash_file 手册,我正在提取文件的内容并在 Java 上创建 MD5 哈希十六进制,但我无法使它们匹配。我尝试了关于 [this question] 的建议但没有成功2

这是我在 Java 上的做法:

public static String calculateStringHash(String text, String encoding) 
        throws NoSuchAlgorithmException, UnsupportedEncodingException{
    MessageDigest md = MessageDigest.getInstance("MD5");
    return getHex(md.digest(text.getBytes(encoding)));
}

我的结果与此页面中的结果相匹配。

例如:

字符串杰克:1200cf8ad328a60559cf5e7c5f46ee6d

来自我的 Java 代码:1200CF8AD328A60559CF5E7C5F46EE6D

但是在尝试文件时它不起作用。这是文件功能的代码:

public static String calculateHash(File file) throws NoSuchAlgorithmException,
            FileNotFoundException, IOException {
        BufferedReader br = null;
        StringBuilder sb = new StringBuilder();
        try {
            String sCurrentLine;
            br = new BufferedReader(new FileReader(file));
            while ((sCurrentLine = br.readLine()) != null) {
                sb.append(sCurrentLine);
            }
        } catch (IOException ex) {
            LOG.log(Level.SEVERE, null, ex);
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException ex) {
                LOG.log(Level.SEVERE, null, ex);
            }
        }
        return calculateStringHash(sb.toString(),"UTF-8");
    }

我验证了在 PHP 端使用了 hash_file 并且 UTF-8 是加密。有任何想法吗?

4

2 回答 2

3

您的阅读方法会从文件中删除所有行尾。readLine()返回一行,没有它的行终止符。打印 StringBuilder 的内容,你就会明白问题所在。

此外,散列算法是二元运算。它对字节进行操作,并返回字节。为什么要将文件中的字节转换为字符串,以便稍后将字符串转换回字节数组以对其进行哈希处理。只需使用 InputStream 将文件作为字节数组读取,而不是将其作为字符串读取。然后散列这个字节数组。这也将避免使用错误的文件编码(您的代码使用平台默认编码,这可能不是用于创建文件的编码)。

于 2012-12-23T16:41:37.730 回答
1

我猜你在调用后错过了文件中的换行符br.readLine()

最好将文件读入字节数组,并将其传递给md.digest(...).

于 2012-12-23T16:41:40.450 回答