Подписание предварительно созданного дайджеста с помощью SunMSCAPI

Дайджест создается на одном сервере и передается на другой сервер для подписи с помощью токенов/ключей. API-интерфейсы шифрования отлично работают с PKCS11 prvoider.

    Cipher c = Cipher.getInstance("RSA");
    c.init(Cipher.ENCRYPT_MODE, pk);

    DigestInfo di = new DigestInfo(new DefaultDigestAlgorithmIdentifierFinder().find("SHA-256"), hash);
    byte[] digestInfo = di.getEncoded();
    byte[] data = c.doFinal(digestInfo);

Но при использовании API-интерфейсов шифрования с поставщиком SunMSCAPI закрытый ключ рассматривается как открытый ключ, пароль токена не запрашивается, а сгенерированная проверка подписи не выполняется. Также использование Cipher с закрытым ключом не является правильным подходом (также обсуждается здесь - https://bugs.openjdk.java.net/browse/JDK-7050158).

Как я могу использовать Signature API, избегая повторного создания дайджеста? Вывод, полученный "NONEWithRSA", будет неправильным, так как мой дайджест - "Sha-256", и проверка подписи завершится ошибкой.


person Abhinav Parashar    schedule 16.06.2017    source источник
comment
Мое последнее испытание с использованием SunMSCAPI для шифрования RSA ранее рассчитанного дайджеста завершилось неудачно из-за ошибки в SunMSCAPI. Я предлагаю использовать другого криптографического провайдера или использовать Signature.sign и позволить SunMSCAPI вычислить дайджест   -  person pedrofb    schedule 16.06.2017
comment
@pedrofb Спасибо за ваш ответ. Любые предложения о том, какой поставщик с открытым исходным кодом я должен использовать? Поскольку SunPkcs11 не работает с версиями Windows (как указано здесь: stackoverflow.com/a/28643362/5285640).   -  person Abhinav Parashar    schedule 16.06.2017
comment
Нет, альтернативного провайдера предложить не могу. Но если есть возможность, используйте стандартный метод подписи вместо хэш+оид+шифрование, т.к. это проблематично   -  person pedrofb    schedule 16.06.2017


Ответы (1)


Пробовал читать исходный код SunMSCAPI. При использовании «NONEWithRSA» на основе длины дайджеста определяется тип дайджеста. Для сигнатур информация дайджеста (AlorithmId+Digest) должна быть подписана, поэтому данные, передаваемые в Signature API, превышают длину дайджеста, а SunMSCAPI выдает ошибку длины данных, которая не поддерживается для переданного дайджеста.

Похоже, что для подписи невозможно использовать предварительно созданный дайджест с провайдером SunMSCAPI. Хотя то же самое отлично работает с провайдером Pkcs11.

person Abhinav Parashar    schedule 17.06.2017