web-dev-qa-db-ja.com

MessageDigest.getInstance( "SHA256")を呼び出すときの例外

Androidでうまく機能するコードがあります。 JRE 1.6を搭載したWindows 64ビットマシンに移植したところ、コードが機能しませんでした。

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

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

次の例外が発生します。

Java.security.NoSuchAlgorithmException:SHA256 MessageDigestはSun.security.jca.GetInstance.getInstance(Unknown Source)のJava.security.Security.getImpl(Unknown Source)at Java.security.MessageDigest.getInstance(Unknown Source)で利用できません

インターネットで、Sun JREに付属する標準の暗号化プロバイダーでSHA256を使用することが可能であると主張している人々や、Bouncy Castleなどの別のプロバイダーを使用する必要があると言っている人々を見つけました。

別のプロバイダーを使用したくない。それを機能させることは可能ですか?

19
kingston

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");
35
David Grant

SHA-256はgetInstance()のパラメーターである必要があります

メッセージダイジェストでサポートされているアルゴリズムのリストへのリンク

4
PermGenError