将PHP hash_file与Java输出进行比较

时间:2012-12-23 16:25:04

标签: java php hash hex md5

我有UTF-8 hash_file的输出,我需要计算并检查我的java客户端。基于hash_file manual我正在提取文件的内容并在Java上创建MD5哈希十六进制,但我无法使它们匹配。我在[这个问题]上尝试了一些建议而没有成功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中的结果相符。

例如:

String jake: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是加密。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

我猜你错过了文件中的新行字符,因为你打电话给br.readLine()

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