2013-04-01 4 views
-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(); 
    } 
} 
+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 или hex. (Обычно данные произвольного размера переносятся как base64, но хэши обычно отображаются в шестнадцатеричном формате.)

+0

удивительный, спасибо! – marcwho

Смежные вопросы