2

这是我的课程的代码:

        public class Md5tester {
private String licenseMd5 = "?jZ2$??f???%?";

public Md5tester(){
    System.out.println(isLicensed());
}
public static void main(String[] args){
    new Md5tester();
}
public boolean isLicensed(){
    File f = new File("C:\\Some\\Random\\Path\\toHash.txt");
    if (!f.exists()) {
        return false;
    }
    try {
        BufferedReader read = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
        //get line from txt
        String line = read.readLine();
        //output what line is
        System.out.println("Line read: " + line);
        //get utf-8 bytes from line
        byte[] lineBytes = line.getBytes("UTF-8");
        //declare messagedigest for hashing
        MessageDigest md = MessageDigest.getInstance("MD5");
        //hash the bytes of the line read
        String hashed = new String(md.digest(lineBytes), "UTF-8");
        System.out.println("Hashed as string: " + hashed);
        System.out.println("LicenseMd5: " + licenseMd5);
        System.out.println("Hashed as bytes: " + hashed.getBytes("UTF-8"));
        System.out.println("LicenseMd5 as bytes: " + licenseMd5.getBytes("UTF-8"));
        if (hashed.equalsIgnoreCase(licenseMd5)){
            return true;
        }
        else{
            return false;
        }
    } catch (FileNotFoundException e) {
        return false;
    } catch (IOException e) {           
        return false;
    } catch (NoSuchAlgorithmException e) {  
        return false;
    }
} 

}

这是我得到的输出:

行阅读:测试

散列为字符串:?jZ2$??f???%?

LicenseMd5: ?jZ2$??f???%?

散列为字节:[B@5fd1acd3

LicenseMd5 为字节:[B@3ea981ca

错误的

我希望有人可以为我解决这个问题,因为我不知道问题是什么。

4

3 回答 3

2

MD5 转换返回的Abyte[]是任意的byte[],因此您不能将其视为String某些编码中的有效表示。

特别是,?s in?jZ2$??f???%?对应于无法在输出编码中表示的字节。这意味着您的内容licenseMd5已经损坏,因此您无法将您的 MD5 哈希与它进行比较。

如果您想表示您的byte[]asString以进行进一步比较,您需要为任意byte[]s 选择适当的表示。例如,您可以使用Base64或十六进制字符串。

您可以byte[]按如下方式转换为十六进制字符串:

public static String toHex(byte[] in) {
    StringBuilder out = new StringBuilder(in.length * 2);
    for (byte b: in) {
        out.append(String.format("%02X", (byte) b));
    }
    return out.toString();
}

另请注意,byte[]使用toString(). 它的结果(例如[B@5fd1acd3)与 的内容无关byte[],因此在您的情况下它没有意义。

于 2012-10-14T17:03:30.827 回答
1

?的打印表示中的符号不hashed​​是文字问号,它们是不可打印的字符。

于 2012-10-14T17:00:54.510 回答
0

当您的 java 文件格式不是 UTF-8 编码而您使用 UTF-8 对字符串进行编码时,您会收到此错误,尝试删除 UTF-8 并且 md5 将输出另一个结果,您可以复制到字符串并查看结果为真。另一种方法是将文件编码设置为UTF-8,字符串编码也不同

于 2012-10-14T17:08:40.273 回答