这是我的代码,我遇到字节编码问题。当我得到明文字符串并对其进行哈希处理,并尝试打印出结果时,它就会搞砸了。例如,对于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();
}
}
答案 0 :(得分:4)
这是问题所在:
byte[] hashedBytes = md.digest(bytesOfPlain);
hash = new String(hashedBytes, "UTF8");
散列的结果是不是 UTF-8编码的文本 - 它只是任意的二进制数据。你在这里所做的就像试图通过将图像文件解释为UTF-8而将图像文件转换为字符串一样毫无意义。
如果必须将哈希值转换为文本,请使用base64或十六进制。 (通常任意大小的数据作为base64传输,但哈希通常以十六进制显示。)