我有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是加密。有什么想法吗?
答案 0 :(得分:3)
您的阅读方法会删除文件中的所有行尾。 readLine()
返回一行,没有行终止符。打印StringBuilder的内容,你就会明白这个问题。
此外,散列算法是二进制运算。它以字节为单位运行,并返回字节。为什么要将文件中的字节转换为String,以便稍后将String转换回字节数组以便对其进行哈希处理。只需使用InputStream将文件作为字节数组读取,而不是将其作为String读取。然后散列这个字节数组。这也将避免使用错误的文件编码(您的代码使用平台默认编码,这可能不是用于创建文件的编码)。
答案 1 :(得分:1)
我猜你错过了文件中的新行字符,因为你打电话给br.readLine()
。
最好将文件读入字节数组,并将其传递到md.digest(...)
。