Исключение при вызове MessageDigest.getInstance( "SHA256" )
У меня есть код, который хорошо работает на Android. Когда я портировал его на 64-разрядную машину Windows с JRE 1.6, код не работал.
Когда я запускаю следующую строку кода:
final MessageDigest digest = 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 со стандартным провайдером криптографии, который поставляется с Sun JRE, и люди говорят, что мне нужно использовать другого провайдера, например, Bouncy Castle.
Я бы предпочел не использовать другого провайдера. Можно ли заставить его работать?
Ответы
Ответ 1
Если вы сомневаетесь в том, какие алгоритмы вы можете использовать для службы JCA, вашим первым портом вызова должна быть JAA стандартная документация по имени алгоритма. Алгоритмы гарантированные, поддерживаемые службой MessageDigest в JVM-совместимой JVM:
-
MD2
-
MD5
-
SHA-1
-
SHA-256
-
SHA-384
-
SHA-512
Общим для поставщиков является предоставление псевдонимов для этих алгоритмов, поэтому он, вероятно, будет работать с Bouncy Castle, но вы должны придерживаться этого, если сможете, чтобы максимизировать переносимость.
Если вы измените код на следующий, он будет работать, как ожидалось:
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
Ответ 2
SHA-256 должен быть параметром getInstance()
Ссылка для списка поддерживаемых алгоритмов для дайджеста сообщений