2011-01-21 10 views
1
package abc.xyz; 
import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

public class SHA2{ 

    private static String convertToHex(byte[] data) { 
     StringBuffer buf = new StringBuffer(); 
     for (int i = 0; i < data.length; i++) { 
      int halfbyte = (data[i] >>> 4) & 0x0F; 
      int two_halfs = 0; 
      do { 
       if ((0 <= halfbyte) && (halfbyte <= 9)) 
        buf.append((char) ('0' + halfbyte)); 
       else 
        buf.append((char) ('a' + (halfbyte - 10))); 
       halfbyte = data[i] & 0x0F; 
      } while(two_halfs++ < 1); 
     } 
     return buf.toString(); 
    }  
public static String SHA2(String text) 
      throws NoSuchAlgorithmException, UnsupportedEncodingException { 

     MessageDigest mesd; 
     mesd = MessageDigest.getInstance("SHA-2"); 
     byte[] sha2hash = new byte[40]; 
     mesd.update(text.getBytes("iso-8859-1"), 0, text.length()); 
     sha2hash = mesd.digest();//error 
     return convertToHex(sha2hash); 
    } } 

digest()を実装する際にエラーが発生しました。SHA2を使用してデータの整合性を検証する方法は?

+0

? – Thariama

+0

少なくとも、コンパイルエラーを修正してください!投稿したメソッドは、いくつかの理由でコンパイルされません。 –

+1

また、あなたが得る例外を読むことを学びます(それがあなたに役立たないときにあなたの質問にそれを中継する)。例外は、問題の内容を示します。 –

答えて

4

SHA-2はアルゴリズムそのものではありません。ウィキペディア:SHA-2は、暗号学的ハッシュ関数のセット(SHA-224、SHA-256、SHA-384、SHA-512)

ある

私はすべてが、SHA-224があるべきだと思います利用可能です。

public static String SHA2(String text) 
    throws NoSuchAlgorithmException, UnsupportedEncodingException { 

    MessageDigest mesd = MessageDigest.getInstance("SHA-256"); 
    byte[] bytes = text.getBytes("iso-8859-1"); 
    mesd.update(bytes, 0, bytes.length); 
    byte[] sha2hash = mesd.digest(); 
    return convertToHex(sha2hash); 
} 

さらに、作成するバイト配列は必要ありません。 digest()メソッドは、配列自体を返します。代入演算子は、結果を既存の配列に書き込むことはありません。もちろん指数を指定しない限り。

もう1つ。 update(..)を呼び出すときにtext.length()を使用しません。なぜなら、結果のバイト配列の長さと必ずしも同じではないからです。これは主に、UTF-8のようなマルチバイト文字エンコーディングの場合です。また、あなたの選択戦略に応じて、マッピングできない文字に対しても発生する可能性があります。さて、主なポイントは、あなたが私が何を言っているのかを知る必要はありません。単純に配列の.lengthを使用して保存してください。

2

どのSHA-2バリアントを使用するかを指定する必要があります(SHA-256またはSHA-512)。これらをダイジェスト名として使用します。

+0

私はまだdigest()を実装できません。 jdkに問題がありますか? – garima

+0

あなたが使用する 'MessageDigest'クラスが[' java.security.MessageDigest'](http://download.oracle.com/javase/6/docs/api/java/security/MessageDigest.html)以外のものである場合、私はあなたがそこでエラーをどうやって得るか本当に見ることができません。コンパイルしたコードが実際にあなたが投稿したコードであることを確認してください(特に、以前はコンパイル不可能なコードを投稿したので)。 –

+0

また、あなたはまだ** digest()を呼び出すことができません。あなたはここに*実装しようとしていません。 「実装する」とは、呼び出したときに実行されるコードを記述することです。 –

1

どのようなエラーがありますか? "sha1hashは解決できません"あなたは変数を宣言していませんでした。 eclipseでctrl-1を押すと、そのジョブが実行されます。 sha2hashはどうですか?私は、そのような変数が1つだけあるべきだと言いたい。テキストとテキスト文字列はどうですか?別の自己混乱?

Btw。「SHA-2」のようなものはありません。これは、SHA-256などを含む一連の関数です。あなたはすでに私は、​​を読んで、特にMessageDigestをお勧めしていない場合は

public static byte[] sha2(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException { 
    final MessageDigest mesd = MessageDigest.getInstance("SHA-256"); 
    mesd.update(text.getBytes("iso-8859-1"), 0, text.length()); 
    return mesd.digest(); 
} 
2

:だから、このような何かを試してみてください。デフォルトのSUN providersを見ると、SHA-2が実際には存在しないことがわかります。代わりに「SHA-512」を試してみてください。

試してみてください。これはどのような言語である

String message = "Some Message"; 

MessageDigest messageDigest = MessageDigest.getInstance("SHA-512"); 

messageDigest.update(message.getBytes("UTF-16BE")); 
byte[] digest = messageDigest.digest(); 

StringBuffer digestInHex = new StringBuffer(); 

for (int i = 0, l = digest.length; i < l; i++) { 
    // Preserve the bit representation when casting to integer. 
    int intRep = digest[i] & 0xFF; 
    // Add leading zero if value is less than 0x10. 
    if (intRep < 0x10) digestInHex.append('\u0030'); 
    // Convert value to hex. 
    digestInHex.append(Integer.toHexString(intRep)); 
} 

System.out.println(digestInHex.toString()); 
+1

文字エンコーディングにUTF-16BEを使用することをお勧めします。アスキー文字以外では正しく動作します。これは本質的に各文字を2バイトに分割し、他のエンコーディングがメタデータの方法として行うさらなるバイトの追加を回避します。また、私は16進数文字列を作成するために用意したループを見ることをお勧めします。これは、あなたの質問で提供した方法を単純化するためです。 – AndyF

+0

本質的に、私がやったことをコピーすると、それはすべて魔法になります。 – AndyF

+0

+1エンコード – ndtreviv

関連する問題