-1

这是我的代码,我在字节编码方面遇到了问题。当我得到明文字符串并对其进行哈希处理并尝试打印出结果时,它会变得一团糟。例如,对于plaintext = "hi",它会打印出: hash: ?????????1?W?p????=?????&

公共类 HASHME {

private String hash;
private String salt;

public HASHME(String plaintext) 
{
    try {
    System.setProperty("file.encoding", "UTF-8");
    salt = "salt";
    plaintext = plaintext + salt;
    byte[] bytesOfPlain = plaintext.getBytes("UTF8");

    MessageDigest md = MessageDigest.getInstance("SHA-256");
    byte[] hashedBytes = md.digest(bytesOfPlain);
    hash = new String(hashedBytes, "UTF8");
    System.out.println("hash: " + hash);

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
4

1 回答 1

4

这就是问题:

byte[] hashedBytes = md.digest(bytesOfPlain);
hash = new String(hashedBytes, "UTF8");

散列的结果不是UTF-8 编码的文本——它只是任意的二进制数据。您在这里所做的与试图通过将图像文件解释为 UTF-8 来将其转换为字符串一样毫无意义。

如果必须将散列转换为文本,请使用base64或十六进制。(通常任意大小的数据以 base64 格式传输,但哈希通常以十六进制显示。)

于 2013-04-01T19:49:12.660 回答