2012-03-12 17 views
32

Ben bir ASP.NET Web API web servisine geçmek ve orada karma karşılaştırın, android bir SHA256 hash elde etmeye çalışıyorum. Bu nedenle, Android'de bir karma oluşturmam gerekiyor, çünkü ASP.NET'te aynı girdiler eşdeğer bir karma üretecektir. Neyi yanlış yaptığımı anlamaya çalışırken saçlarımı çekiyorum.Compute SHA256 Android/Java ve C Comp içinde hash #

İşte Android kod:

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(); 
} 

VE BURADA SUNUCU (C#) AÇIK KOD var:

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(); 
    } 

GÜNCELLEME: Burada düzeltilmiş Android/Java uygulamasıdır (teşekkür ederim Nikolay Elenkov):

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

Bugün beni ne kadar zaman kurtardığına inanamıyorum. Güncellemeyi gönderdiğiniz için teşekkür ederiz. –

+0

Karma dizeyi java'daki orijinal girdiye nasıl dönüştürebilirim. herhangi bir fikir teşekkürler –

+0

Bir crytpographic hash tek yönlüdür ... lütfen aşağıdaki makaleye bakın: http://en.wikipedia.org/wiki/Cryptographic_hash_function – Kevin

cevap

20

Java kodunuz yanlış: giriş baytlarını iki kez ekliyorsunuz. Bunu bir seferde hesaplıyorsanız, ya digest(bytes) numaralı telefonu arayın ya da update(bytes)'dan sonra digest()'u arayın;

+0

Boom! Teşekkürler Nikolay. – Kevin