【问题标题】:Compare PHP hash_file with Java output比较 PHP hash_file 和 Java 输出
【发布时间】:2012-12-10 08:37:02
【问题描述】:

我有 UTF-8 hash_file 的输出,我需要在我的 java 客户端上计算和检查。基于hash_file manual,我正在提取文件的内容并在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)));
}

我的结果与this page 的结果一致。

例如:

字符串杰克: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 是加密。有什么想法吗?

【问题讨论】:

  • UTF-8 是encoding,而不是加密。

标签: java php hash hex md5


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多