NoSuchAlgorithmException: алгоритм HmacSHA1 недоступен - PullRequest
9 голосов
/ 18 мая 2010

Посмотрите на следующую строку Java:

Mac.getInstance("HmacSHA1");

Если я помещу это в простую тестовую программу, она без проблем запустится на моем сервере. Однако, если я использую эту строку в контейнере, я получаю

java.security.NoSuchAlgorithmException: Algorithm HmacSHA1 not available
  at javax.crypto.Mac.getInstance(DashoA13*..)

В обоих случаях используется одна и та же установка JDK.

Немного погуглив, мне удалось заставить его работать, выполнив две вещи:

  1. Копирование sunjce_provider.jar из $JAVA_HOME/jre/lib/ext в каталог lib контейнера.
  2. Добавление следующей строки в мой код:

    java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE());

В частности, это происходит со мной в Apache James Mailet, но я уверен, что это связано с опциями JVM. Вот скрипт запуска , который он использует.

Хотя я заставил его работать в конце, решение кажется слишком взломанным, чтобы быть правильным. Буду признателен за объяснение происходящего, а также за более «правильное» решение.

Смежный вопрос : Использование Java crypto приводит к NoSuchAlgorithmException . Тем не менее, в этом случае я почти уверен, что алгоритм HmacSHA1 должен поддерживаться "из коробки". В качестве доказательства, это работает без проблем в тестовой программе.

Ответы [ 4 ]

11 голосов
/ 18 мая 2010

Сценарий запуска устанавливает java.ext.dirs для своего собственного набора каталогов (специфичных для приложения), но пропускает «нормальный» каталог расширений ($JAVA_HOME/jre/lib/ext/), в котором находится sunjce_provider.jar. Это объясняет вашу первую мысль (копирование файла Jar в каталог lib делает его снова видимым). Это легко воспроизвести.

Что касается второго пункта, я думаю, что это связано с файлом политики, который сценарий запуска устанавливает с параметром -Djava.security.policy. Доступны ли некоторые поставщики или нет, зависит от файлов политики. Файл политики по умолчанию делает поставщика SunJCE доступным, но, поскольку сценарии запуска требуют нестандартный файл политики по умолчанию, тогда все идет. Я предлагаю вам взглянуть на этот файл политики.

Например, в моей системе (Ubuntu Linux с Sun JVM 1.6.0_20 в комплекте с Ubuntu) файл политики по умолчанию находится в /etc/java-6-sun/security/java.security и содержит (среди прочего) следующие строки:

security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC

, которые определяют, какие провайдеры должны быть доступны по умолчанию. Исходя из ваших симптомов, я считаю, что файл пользовательской политики сделал SunJCE недоступным, если он не был явно зарегистрирован (что понятно, поскольку сценарий запуска также удалил доступ к файлу Jar, содержащему SunJCE ...).

0 голосов
/ 09 января 2018

Правильная сокращенная форма как ниже

HmacMD5
HmacSHA1
HmacSHA256
0 голосов
/ 26 июля 2017

Попробуйте изменить версию Java

Я получаю исключение NoSuchAlgorithmException: "Unable to obtain JCA MAC algorithm 'HmacSHA512'" в следующей версии Java:

Java-версия "1.8.0_131"
Java (TM) SE Runtime Environment (сборка 1.8.0_131-b11)
Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 25.131-b11, смешанный режим)

После изменения версии JDK на следующую, проблема была решена:

Java-версия "1.8.0_45"
Java (TM) SE Runtime Environment (сборка 1.8.0_45-b15)
Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 25.45-b02, смешанный режим)

Требуемая банка для этой проблемы: sunjce_provider.jar Возможно, она повреждена.

0 голосов
/ 20 декабря 2012

Сокращено до SHA1, MD5 и SHA256

...