Atom Лента - Форум КриптоПро - Тема:Неверная длина подписи - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:Nevernajadlinapodpisi-10:1Copyright 2024 Форум КриптоПро2024-03-28T21:39:46Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruЕвгений Афанасьевhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=1064&name=Евгений АфанасьевЕвгений Афанасьевhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=1064&name=Евгений Афанасьевmavanichhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=47381&name=mavanichЕвгений Афанасьевhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=1064&name=Евгений Афанасьевmavanichhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=47381&name=mavanichЕвгений Афанасьевhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=1064&name=Евгений Афанасьевmavanichhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=47381&name=mavanichYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid128273:1Неверная длина подписи<table class="content postContainer_Alt" width="100%"><tr><td>1.2.643.7.1.1.1.1 - oid параметров ключа, он лежит в signatureAlgorithm.<br />В примере CMSSign (пакет CMS_samples в samples-sources.jar) есть метод createHashCMSEx, в нем функции<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-java">
String keyAlg = <алгоритм_ключа, можно подать сюда signatureAlgorithm>
String digestOid = AlgorithmUtility.keyAlgToDigestOid(keyAlg);
String keyOid = AlgorithmUtility.keyAlgToKeyAlgorithmOid(keyAlg); // алгоритм ключа подписи
String signOid = AlgorithmUtility.keyAlgToSignatureOid(keyAlg);
</code></pre>
</div></div><br />а в CMSVerify с проверкой подписи - ф. validateSignatureAlgorithm.</td></tr></table>2021-10-25T13:51:20+03:002021-10-25T13:51:20+03:00Евгений Афанасьев<table class="content postContainer_Alt" width="100%"><tr><td>1.2.643.7.1.1.1.1 - oid параметров ключа, он лежит в signatureAlgorithm.<br />В примере CMSSign (пакет CMS_samples в samples-sources.jar) есть метод createHashCMSEx, в нем функции<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-java">
String keyAlg = <алгоритм_ключа, можно подать сюда signatureAlgorithm>
String digestOid = AlgorithmUtility.keyAlgToDigestOid(keyAlg);
String keyOid = AlgorithmUtility.keyAlgToKeyAlgorithmOid(keyAlg); // алгоритм ключа подписи
String signOid = AlgorithmUtility.keyAlgToSignatureOid(keyAlg);
</code></pre>
</div></div><br />а в CMSVerify с проверкой подписи - ф. validateSignatureAlgorithm.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid128265:1Неверная длина подписи<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Евгений Афанасьев <a href="/forum2/default.aspx?g=posts&m=128226#post128226"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><br />"как налету по подписи определить алгоритм хэширования и алгоритм подписи ?" - они есть в подписи, их нужно читать из нее (должно быть в примерах пакета CMS).<br /></div></div><br /><br />Евгений, можно еще глупый вопрос? Нужно заводить маппинг соответствия идентификаторов значениям ?<br />В SignerInfo для поля signatureAlgorithm содержится значение "1.2.643.7.1.1.1.1" - для него необходимо звать<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-java">java.security.Signature.getInstance("GOST3411_2012_256withGOST3410_2012_256", "JCP");</code></pre>
</div></div><br /><br />Непонятно как от первого ("1.2.643.7.1.1.1.1") прийти ко второму "GOST3411_2012_256withGOST3410_2012_256"?<br /><br /></td></tr></table>2021-10-25T11:17:45+03:002021-10-25T11:17:45+03:00mavanich<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Евгений Афанасьев <a href="/forum2/default.aspx?g=posts&m=128226#post128226"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><br />"как налету по подписи определить алгоритм хэширования и алгоритм подписи ?" - они есть в подписи, их нужно читать из нее (должно быть в примерах пакета CMS).<br /></div></div><br /><br />Евгений, можно еще глупый вопрос? Нужно заводить маппинг соответствия идентификаторов значениям ?<br />В SignerInfo для поля signatureAlgorithm содержится значение "1.2.643.7.1.1.1.1" - для него необходимо звать<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-java">java.security.Signature.getInstance("GOST3411_2012_256withGOST3410_2012_256", "JCP");</code></pre>
</div></div><br /><br />Непонятно как от первого ("1.2.643.7.1.1.1.1") прийти ко второму "GOST3411_2012_256withGOST3410_2012_256"?<br /><br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid128226:1Неверная длина подписи<table class="content postContainer_Alt" width="100%"><tr><td>"true при проверке подписи получаю только если needSortSignedAttributes = true указывать." - возможно, подписанные атрибуты не упорядочены (перед подписью они упорядочиваются). <br />"можно без двух проверок обойтись ?" - попробуйте проверить с помощью CAdESSignature, но потребуется установить корневой сертификат в cacerts. Описание CAdESSignature можно найти в Doc/CAdES-javadoc.jar и в рук-ве программиста. Примеры в пакете CAdES архива samples-sources.jar.<br />"как налету по подписи определить алгоритм хэширования и алгоритм подписи ?" - они есть в подписи, их нужно читать из нее (должно быть в примерах пакета CMS).<br />"можно комментарий относительно этого" - как написано, рекомендуется CAdES.jar, т.к. он содержит необходимое внутри и сокращает объем кода, который необходимо написать + поточная подпись больших объёмов данных.</td></tr></table>2021-10-22T16:05:25+03:002021-10-22T16:05:25+03:00Евгений Афанасьев<table class="content postContainer_Alt" width="100%"><tr><td>"true при проверке подписи получаю только если needSortSignedAttributes = true указывать." - возможно, подписанные атрибуты не упорядочены (перед подписью они упорядочиваются). <br />"можно без двух проверок обойтись ?" - попробуйте проверить с помощью CAdESSignature, но потребуется установить корневой сертификат в cacerts. Описание CAdESSignature можно найти в Doc/CAdES-javadoc.jar и в рук-ве программиста. Примеры в пакете CAdES архива samples-sources.jar.<br />"как налету по подписи определить алгоритм хэширования и алгоритм подписи ?" - они есть в подписи, их нужно читать из нее (должно быть в примерах пакета CMS).<br />"можно комментарий относительно этого" - как написано, рекомендуется CAdES.jar, т.к. он содержит необходимое внутри и сокращает объем кода, который необходимо написать + поточная подпись больших объёмов данных.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid128223:1Неверная длина подписи<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Евгений Афанасьев <a href="/forum2/default.aspx?g=posts&m=128219#post128219"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Здравствуйте.<br />1. Вы в Signature подаете x509Certificate.getSigAlgName(), а это алгоритм подписи сертификата (как он был подписан), а не алгоритм подписи сообщения: УЦ может подписать сертификат ключом на алгоритме 2012 (256), а открытый ключ в сертификате может быть при этом 2012 (512) - длина подписи для них разная. Проверка устроена неверно, т.к. все сведения уже есть в подписи. У CMSSignedData есть методы проверки подписи.<br />2. CMS подпись делается на все подписанные атрибуты (в их числе - атрибут с хешом данных), а вы проверяете по хешу данных.<br />Используйте примеры из samples-sources.jar, пакеты CAdES, CMS.</div></div><br /><br />Здравствуйте. По примерам из samples-sources.jar.<br /><br />true при проверке подписи получаю только если needSortSignedAttributes = true указывать.<br /><br />Не подскажете, можно без двух проверок обойтись ?<br />И как налету по подписи определить алгоритм хэширования и алгоритм подписи ?<br /><br />И еще можно комментарий относительно этого :<br /><em> /**<br /> * проверка CMS<br /> *<br /> * <strong>@deprecated начиная с версии 1.0.54, следует использовать функцонал CAdES API (CAdES.jar)</strong><br /> * @since 2.0<br /> */<br /></em></td></tr></table>2021-10-22T14:22:47+03:002021-10-22T14:22:47+03:00mavanich<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Евгений Афанасьев <a href="/forum2/default.aspx?g=posts&m=128219#post128219"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Здравствуйте.<br />1. Вы в Signature подаете x509Certificate.getSigAlgName(), а это алгоритм подписи сертификата (как он был подписан), а не алгоритм подписи сообщения: УЦ может подписать сертификат ключом на алгоритме 2012 (256), а открытый ключ в сертификате может быть при этом 2012 (512) - длина подписи для них разная. Проверка устроена неверно, т.к. все сведения уже есть в подписи. У CMSSignedData есть методы проверки подписи.<br />2. CMS подпись делается на все подписанные атрибуты (в их числе - атрибут с хешом данных), а вы проверяете по хешу данных.<br />Используйте примеры из samples-sources.jar, пакеты CAdES, CMS.</div></div><br /><br />Здравствуйте. По примерам из samples-sources.jar.<br /><br />true при проверке подписи получаю только если needSortSignedAttributes = true указывать.<br /><br />Не подскажете, можно без двух проверок обойтись ?<br />И как налету по подписи определить алгоритм хэширования и алгоритм подписи ?<br /><br />И еще можно комментарий относительно этого :<br /><em> /**<br /> * проверка CMS<br /> *<br /> * <strong>@deprecated начиная с версии 1.0.54, следует использовать функцонал CAdES API (CAdES.jar)</strong><br /> * @since 2.0<br /> */<br /></em></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid128219:1Неверная длина подписи<table class="content postContainer_Alt" width="100%"><tr><td>Здравствуйте.<br />1. Вы в Signature подаете x509Certificate.getSigAlgName(), а это алгоритм подписи сертификата (как он был подписан), а не алгоритм подписи сообщения: УЦ может подписать сертификат ключом на алгоритме 2012 (256), а открытый ключ в сертификате может быть при этом 2012 (512) - длина подписи для них разная. Проверка устроена неверно, т.к. все сведения уже есть в подписи. У CMSSignedData есть методы проверки подписи.<br />2. CMS подпись делается на все подписанные атрибуты (в их числе - атрибут с хешом данных), а вы проверяете по хешу данных.<br />Используйте примеры из samples-sources.jar, пакеты CAdES, CMS.</td></tr></table>2021-10-22T13:26:55+03:002021-10-22T13:26:55+03:00Евгений Афанасьев<table class="content postContainer_Alt" width="100%"><tr><td>Здравствуйте.<br />1. Вы в Signature подаете x509Certificate.getSigAlgName(), а это алгоритм подписи сертификата (как он был подписан), а не алгоритм подписи сообщения: УЦ может подписать сертификат ключом на алгоритме 2012 (256), а открытый ключ в сертификате может быть при этом 2012 (512) - длина подписи для них разная. Проверка устроена неверно, т.к. все сведения уже есть в подписи. У CMSSignedData есть методы проверки подписи.<br />2. CMS подпись делается на все подписанные атрибуты (в их числе - атрибут с хешом данных), а вы проверяете по хешу данных.<br />Используйте примеры из samples-sources.jar, пакеты CAdES, CMS.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid128213:1Неверная длина подписи<table class="content postContainer" width="100%"><tr><td>Подпись формируется <a rel="nofollow" href="https://www.cryptopro.ru/sites/default/files/products/cades/demopage/cades_bes_sample.html" title="https://www.cryptopro.ru/sites/default/files/products/cades/demopage/cades_bes_sample.html">здесь</a><br />Информация о сертификате<br />Алгоритм ключа: ГОСТ Р 34.10-2012 256 бит<br />Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider<br />Статус: Действителен<br /><br />При выполнении кода получаю ошибку <strong>"Неверная длина подписи"</strong><br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-java">
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());
}
</code></pre>
</div></div><br /><br />Если в коде заменить<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-java">java.security.Signature.getInstance(JCP.GOST_SIGN_2012_256_NAME, "JCP");</code></pre>
</div></div><br />verified == false<br /><br />Что делаю не так ?<br /><br /></td></tr></table>2021-10-22T10:35:19+03:002021-10-22T10:35:19+03:00mavanich<table class="content postContainer" width="100%"><tr><td>Подпись формируется <a rel="nofollow" href="https://www.cryptopro.ru/sites/default/files/products/cades/demopage/cades_bes_sample.html" title="https://www.cryptopro.ru/sites/default/files/products/cades/demopage/cades_bes_sample.html">здесь</a><br />Информация о сертификате<br />Алгоритм ключа: ГОСТ Р 34.10-2012 256 бит<br />Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider<br />Статус: Действителен<br /><br />При выполнении кода получаю ошибку <strong>"Неверная длина подписи"</strong><br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-java">
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());
}
</code></pre>
</div></div><br /><br />Если в коде заменить<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-java">java.security.Signature.getInstance(JCP.GOST_SIGN_2012_256_NAME, "JCP");</code></pre>
</div></div><br />verified == false<br /><br />Что делаю не так ?<br /><br /></td></tr></table>