Статус: Новичок
Группы: Участники
Зарегистрирован: 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 Что делаю не так ?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,997 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 712 раз в 673 постах
|
Здравствуйте. 1. Вы в Signature подаете x509Certificate.getSigAlgName(), а это алгоритм подписи сертификата (как он был подписан), а не алгоритм подписи сообщения: УЦ может подписать сертификат ключом на алгоритме 2012 (256), а открытый ключ в сертификате может быть при этом 2012 (512) - длина подписи для них разная. Проверка устроена неверно, т.к. все сведения уже есть в подписи. У CMSSignedData есть методы проверки подписи. 2. CMS подпись делается на все подписанные атрибуты (в их числе - атрибут с хешом данных), а вы проверяете по хешу данных. Используйте примеры из samples-sources.jar, пакеты CAdES, CMS. Отредактировано пользователем 22 октября 2021 г. 13:26:55(UTC)
| Причина: Не указана |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,997 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 712 раз в 673 постах
|
"true при проверке подписи получаю только если needSortSignedAttributes = true указывать." - возможно, подписанные атрибуты не упорядочены (перед подписью они упорядочиваются). "можно без двух проверок обойтись ?" - попробуйте проверить с помощью CAdESSignature, но потребуется установить корневой сертификат в cacerts. Описание CAdESSignature можно найти в Doc/CAdES-javadoc.jar и в рук-ве программиста. Примеры в пакете CAdES архива samples-sources.jar. "как налету по подписи определить алгоритм хэширования и алгоритм подписи ?" - они есть в подписи, их нужно читать из нее (должно быть в примерах пакета CMS). "можно комментарий относительно этого" - как написано, рекомендуется CAdES.jar, т.к. он содержит необходимое внутри и сокращает объем кода, который необходимо написать + поточная подпись больших объёмов данных. Отредактировано пользователем 22 октября 2021 г. 16:05:25(UTC)
| Причина: Не указана |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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"?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,997 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 712 раз в 673 постах
|
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. |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.12.2021(UTC) Сообщений: 253 Откуда: Новосибирск Сказал(а) «Спасибо»: 77 раз Поблагодарили: 1 раз в 1 постах
|
у меня почему-то getCertificates() пустую коллекцию возвращает, в цикл forEach не заходит :( Store<X509CertificateHolder> certs = cmsSignedData.getCertificates(); certs.getMatches(signerInformation.getSID()).forEach((matchesCertificate) -> { ... } CMSSignedData cmsSignedData = new CMSSignedData(Base64.getDecoder().decode(signature)); вот тут в signature можно передавать содержимое файла с присоединённой подписью? или нужно как то её сначала отделить? Отредактировано пользователем 9 декабря 2024 г. 12:19:26(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close