2012-03-12 2 views
32

에서 SHA256 해시 계산 안드로이드에서 SHA256 해시를 생성하려고합니다. 그런 다음 ASP.NET 웹 API 웹 서비스에 전달하여 해시를 비교합니다. 따라서 안드로이드에서 해쉬를 생성해야하는데, ASP.NET에서 동일한 입력 값을 사용하면 해시가 생성됩니다. 나는 내가 뭘 잘못하고 있는지 알아 내려고 내 머리카락을 꺼내고있어.안드로이드/자바 및 C#

여기에 안드로이드 코드입니다 :

public String computeHash(String input) throws NoSuchAlgorithmException{ 
    MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
    digest.reset(); 
    try{ 
     digest.update(input.getBytes("UTF-8")); 
    } catch (UnsupportedEncodingException e){ 
     e.printStackTrace(); 
    } 

    byte[] byteData = digest.digest(input.getBytes()); 
    StringBuffer sb = new StringBuffer(); 

    for (int i = 0; i < byteData.length; i++){ 
     sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); 
    } 
    return sb.toString(); 
} 

그리고 여기에 서버 (C#을)의 코드입니다 :

private static string ComputeHash(string input, HashAlgorithm algorithm) 
    { 

     Byte[] inputBytes = Encoding.UTF8.GetBytes(input); 
     Byte[] hashedBytes = algorithm.ComputeHash(inputBytes); 

     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < hashedBytes.Length; i++) 
     { 
      sb.Append(String.Format("{0:x2}", hashedBytes[i])); 
     } 

     return sb.ToString(); 
    } 

UPDATE : 여기 수정 된 안드로이드/Java 구현입니다 (감사합니다 니콜라이 엘렌 코프) :

public String computeHash(String input) throws NoSuchAlgorithmException, UnsupportedEncodingException{ 
    MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
    digest.reset(); 

    byte[] byteData = digest.digest(input.getBytes("UTF-8")); 
    StringBuffer sb = new StringBuffer(); 

    for (int i = 0; i < byteData.length; i++){ 
     sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); 
    } 
    return sb.toString(); 
} 
+2

오늘 너희들이 나를 얼마나 구원했는지 믿을 수가 없어. 업데이트를 게시 해 주셔서 감사합니다. –

+0

어떻게 해시 문자열을 자바의 원래 입력으로 변환 할 수 있습니까? 어떤 아이디어 감사 –

+0

crytpographic 해시는 단방향입니다 ... http://en.wikipedia.org/wiki/Cryptographic_hash_function – Kevin

답변

20

Java 코드가 잘못되었습니다. 입력 바이트를 두 번 추가하는 중입니다. 한 번에 계산할 경우 digest(bytes)으로 전화하거나 update(bytes) 이후에 digest()으로 전화해야합니다.

+0

붐! Nikolay 감사합니다. – Kevin