2012-09-28 9 views
16

私はAndroid上でうまく動作するコードを持っています。 JRE 1.6を搭載したWindows 64ビットマシンに移植したとき、コードは機能しませんでした。MessageDigest.getInstance( "SHA256")を呼び出すときの例外

私は、次のコード行を実行すると:

java.security.NoSuchAlgorithmException: SHA256 MessageDigest not available 
at sun.security.jca.GetInstance.getInstance(Unknown Source) 
at java.security.Security.getImpl(Unknown Source) 
at java.security.MessageDigest.getInstance(Unknown Source) 

が、私は標準暗号でSHA256を使用することが可能であることを主張し、インターネットの人に見つかった:私は、次の例外を取得

final MessageDigest digest = MessageDigest.getInstance("SHA256") 

をSun JREに付属のプロバイダと、たとえばBouncy Castleのような別のプロバイダを使用する必要があると言っている人がいます。

別のプロバイダを使用しないことをお勧めします。それを動作させることは可能ですか?

答えて

29

JCAサービスで使用できるアルゴリズムが不明な場合は、最初のコールポートはJCA Standard Algorithm Name Documentationにする必要があります。 は、JCA準拠のJVMでMessageDigestサービスでサポートされるようにを保証するアルゴリズムは、以下のとおりです。

  • MD2
  • MD5
  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512

プロバイダがこれらのアルゴリズムのエイリアスを提供するのは一般的です。そのため、Bouncy Castleではおそらく動作しますが、移植性を最大限に高めるにはこれらに固執する必要があります。あなたは、次のようにコードを変更した場合

、それが期待どおりに動作します:

final MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
+0

はい、 '「SHA256へのパラメータでなければなりません"はBouncyに存在するエイリアスです。私はJounの標準名である '' SHA-256''ではなく、Bouncyのプロトコルパッケージの一つに '' SHA256 ''を使ったBouncy Castleバグを修正しました。これは絶対最小以上のものを受け入れる危険です。一方的にしか動作しません。 –

+1

だから、 "保証された" MD5が失敗したときはどうしますか? Oracle JREでは、一部のマシンのみで、他のマシンでは使用できません。 : –

+0

あなたのセキュリティプロバイダを確認しましたか? –

関連する問題