2013-04-01 95 views
-1

這是我的代碼,我有字節編碼的問題。當我得到純文本字符串並對其進行散列並嘗試打印結果時,它會變得混亂。例如,對於明文=「嗨」,它會打印出: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(); 
    } 
} 
+0

可以打印出bytesOfPlain以及hashedBytes – CodeGuy

+1

***你期待什麼***,它正在做你所問的它打印不可打印的字符,它不會神奇地十六進制編碼字節,這可能是你期望的,但我們不知道,只能猜測。 –

+1

請參閱[http://stackoverflow.com/questions/9655181/convert-from-byte-array-to-hex-string-in-java](http://stackoverflow.com/questions/9655181/convert-from- byte-array-to-hex-string-in-java) –

回答

4

這就是問題所在:

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

散列的結果是 UTF-8編碼的文本 - 它只是任意的二進制數據。你在這裏做的和試圖通過將圖像文件解釋爲UTF-8來將圖像文件轉換爲字符串一樣沒有意義。

如果您要必須將散列轉換爲文本,請使用base64或十六進制。 (通常任意大小的數據是以base64的形式傳輸的,但散列通常以十六進制顯示。)

+0

真棒,謝謝! – marcwho