2013-04-01 2 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

byteshedfyain 및 hashedBytes를 인쇄 할 수 있습니까 – CodeGuy

+1

*** 무엇을 기대합니까 ***, 요청하는 것을 수행하고 있습니다 그것은 인쇄 할 수없는 문자를 출력하기 위해, 여러분이 기대하고있는 바이트를 마술처럼 16 진수로 인코딩하지는 않습니다. 그러나 우리는 전혀 모르고 오직 추측 할 수 있습니다. –

+1

참조 [http://stackoverflow.com/questions/9655181/convert-from-byte-array-to-hex-string-in-java](http://stackoverflow.com/questions/9655181/convert-from- 바이트 배열에서 16 진수 문자열 - 자바) –

답변

4

이 문제입니다 : 해싱의

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

결과는 하지 UTF-8로 인코딩 된 텍스트입니다 - 그냥 임의의 이진 데이터입니다. 여기에서하는 일은 UTF-8로 해석하여 이미지 파일을 문자열로 바꾸는 것보다 의미가 없습니다.

의 경우은 해시를 텍스트로 변환해야하며 base64 또는 16 진수를 사용하십시오. (일반적으로 임의의 크기의 데이터는 base64로 전송되지만 해시는 대개 16 진수로 표시됩니다.)

+0

끝내 주셔서 감사합니다! – marcwho