2012-03-12 10 views
32

私は、アンドロイドでSHA256ハッシュを生成しようとしています。それからASP.NET Web API Webサービスに渡してハッシュを比較します。そのため、私はAndroidでハッシュを構築する必要があります。これは、ASP.NETの同じ入力で同等のハッシュが生成されるためです。私は何が間違っているのか理解しようとしている私の髪を引っ張っています。Android/JavaとC#で計算SHA256ハッシュ

ここでAndroidのコードです:

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

、ここでSERVER(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:ここ 修正のAndroid/Java実装である(ありがとう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

あなたが今日私を救った時間は信じられません。アップデートを投稿していただきありがとうございます。 –

+0

ハッシュ文字列をJavaの元の入力に戻すにはどうしたらいいですか?任意のアイデアありがとう –

+0

暗号化ハッシュは一方向です...次の記事を参照してください:http://en.wikipedia.org/wiki/Cryptographic_hash_function – Kevin

答えて

20

Javaコードが間違っています:入力バイトを2回追加しています。これを一度に計算する場合は、digest(bytes)に電話するか、update(bytes)の後にdigest()に電話する必要があります。

+0

ブーム! Nikolayありがとうございました。 – Kevin

関連する問題