Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline mavanich  
#1 Оставлено : 22 октября 2021 г. 10:35:19(UTC)
mavanich

Статус: Новичок

Группы: Участники
Зарегистрирован: 21.12.2017(UTC)
Сообщений: 4

Сказал(а) «Спасибо»: 3 раз
Подпись формируется здесь
Информация о сертификате
Алгоритм ключа: ГОСТ Р 34.10-2012 256 бит
Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
Статус: Действителен

При выполнении кода получаю ошибку "Неверная длина подписи"

Код:

byte[] signature=...;
byte[] data=...;
X509Certificate x509Certificate=...;

        try {
            CMSSignedData cmsSignedData = new CMSSignedData(Base64.getDecoder().decode(signature));
            cmsSignedData.getSignerInfos().getSigners().forEach((SignerInformation signerInformation) ->
                    cmsSignedData.getCertificates().getMatches(signerInformation.getSID()).forEach((matchesCertificate) -> {
                        try {
                            java.security.Signature javaSignature = java.security.Signature.getInstance(x509Certificate.getSigAlgName(),//JCP.GOST_SIGN_2012_256_NAME,                                    
                                "JCP");
                            javaSignature.initVerify(x509Certificate);
                            javaSignature.update(data);
                            l.verified = javaSignature.verify(signerInformation.getSignature());
                        } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | NoSuchProviderException e) {
                            logger.error(e.getLocalizedMessage());
                            throw new RuntimeException(e);
                        }
                    }));
        } catch (Throwable e) {
            logger.error(e.getMessage());
        }



Если в коде заменить
Код:
java.security.Signature.getInstance(JCP.GOST_SIGN_2012_256_NAME, "JCP");

verified == false

Что делаю не так ?

Offline Евгений Афанасьев  
#2 Оставлено : 22 октября 2021 г. 13:26:06(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,910
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
1. Вы в Signature подаете x509Certificate.getSigAlgName(), а это алгоритм подписи сертификата (как он был подписан), а не алгоритм подписи сообщения: УЦ может подписать сертификат ключом на алгоритме 2012 (256), а открытый ключ в сертификате может быть при этом 2012 (512) - длина подписи для них разная. Проверка устроена неверно, т.к. все сведения уже есть в подписи. У CMSSignedData есть методы проверки подписи.
2. CMS подпись делается на все подписанные атрибуты (в их числе - атрибут с хешом данных), а вы проверяете по хешу данных.
Используйте примеры из samples-sources.jar, пакеты CAdES, CMS.

Отредактировано пользователем 22 октября 2021 г. 13:26:55(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
mavanich оставлено 22.10.2021(UTC)
Offline mavanich  
#3 Оставлено : 22 октября 2021 г. 13:54:32(UTC)
mavanich

Статус: Новичок

Группы: Участники
Зарегистрирован: 21.12.2017(UTC)
Сообщений: 4

Сказал(а) «Спасибо»: 3 раз
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
1. Вы в Signature подаете x509Certificate.getSigAlgName(), а это алгоритм подписи сертификата (как он был подписан), а не алгоритм подписи сообщения: УЦ может подписать сертификат ключом на алгоритме 2012 (256), а открытый ключ в сертификате может быть при этом 2012 (512) - длина подписи для них разная. Проверка устроена неверно, т.к. все сведения уже есть в подписи. У CMSSignedData есть методы проверки подписи.
2. CMS подпись делается на все подписанные атрибуты (в их числе - атрибут с хешом данных), а вы проверяете по хешу данных.
Используйте примеры из samples-sources.jar, пакеты CAdES, CMS.


Здравствуйте. По примерам из samples-sources.jar.

true при проверке подписи получаю только если needSortSignedAttributes = true указывать.

Не подскажете, можно без двух проверок обойтись ?
И как налету по подписи определить алгоритм хэширования и алгоритм подписи ?

И еще можно комментарий относительно этого :
/**
* проверка CMS
*
* @deprecated начиная с версии 1.0.54, следует использовать функцонал CAdES API (CAdES.jar)
* @since 2.0
*/

Отредактировано пользователем 22 октября 2021 г. 14:22:47(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 22 октября 2021 г. 15:43:52(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,910
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
"true при проверке подписи получаю только если needSortSignedAttributes = true указывать." - возможно, подписанные атрибуты не упорядочены (перед подписью они упорядочиваются).
"можно без двух проверок обойтись ?" - попробуйте проверить с помощью CAdESSignature, но потребуется установить корневой сертификат в cacerts. Описание CAdESSignature можно найти в Doc/CAdES-javadoc.jar и в рук-ве программиста. Примеры в пакете CAdES архива samples-sources.jar.
"как налету по подписи определить алгоритм хэширования и алгоритм подписи ?" - они есть в подписи, их нужно читать из нее (должно быть в примерах пакета CMS).
"можно комментарий относительно этого" - как написано, рекомендуется CAdES.jar, т.к. он содержит необходимое внутри и сокращает объем кода, который необходимо написать + поточная подпись больших объёмов данных.

Отредактировано пользователем 22 октября 2021 г. 16:05:25(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
mavanich оставлено 22.10.2021(UTC)
Offline mavanich  
#5 Оставлено : 25 октября 2021 г. 11:17:45(UTC)
mavanich

Статус: Новичок

Группы: Участники
Зарегистрирован: 21.12.2017(UTC)
Сообщений: 4

Сказал(а) «Спасибо»: 3 раз
Автор: Евгений Афанасьев Перейти к цитате

"как налету по подписи определить алгоритм хэширования и алгоритм подписи ?" - они есть в подписи, их нужно читать из нее (должно быть в примерах пакета CMS).


Евгений, можно еще глупый вопрос? Нужно заводить маппинг соответствия идентификаторов значениям ?
В SignerInfo для поля signatureAlgorithm содержится значение "1.2.643.7.1.1.1.1" - для него необходимо звать

Код:
java.security.Signature.getInstance("GOST3411_2012_256withGOST3410_2012_256", "JCP");


Непонятно как от первого ("1.2.643.7.1.1.1.1") прийти ко второму "GOST3411_2012_256withGOST3410_2012_256"?

Offline Евгений Афанасьев  
#6 Оставлено : 25 октября 2021 г. 13:51:20(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,910
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
1.2.643.7.1.1.1.1 - oid параметров ключа, он лежит в signatureAlgorithm.
В примере CMSSign (пакет CMS_samples в samples-sources.jar) есть метод createHashCMSEx, в нем функции
Код:

String keyAlg    = <алгоритм_ключа, можно подать сюда signatureAlgorithm>
String digestOid = AlgorithmUtility.keyAlgToDigestOid(keyAlg);
String keyOid    = AlgorithmUtility.keyAlgToKeyAlgorithmOid(keyAlg); // алгоритм ключа подписи
String signOid   = AlgorithmUtility.keyAlgToSignatureOid(keyAlg);

а в CMSVerify с проверкой подписи - ф. validateSignatureAlgorithm.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
mavanich оставлено 25.10.2021(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.