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などの別のプロバイダーを使用する必要があると言っている人々を見つけました。
別のプロバイダーを使用したくない。それを機能させることは可能ですか?
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");
SHA-256はgetInstance()のパラメーターである必要があります