字符串编码问题

时间:2013-04-01 19:47:20

标签: java string character-encoding byte

这是我的代码,我遇到字节编码问题。当我得到明文字符串并对其进行哈希处理,并尝试打印出结果时,它就会搞砸了。例如,对于plaintext =“hi”,它打印出来:hash:??????????????????????????

公共课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();
    }
}

1 个答案:

答案 0 :(得分:4)

这是问题所在:

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

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

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