Статус: Новичок
Группы: Участники
Зарегистрирован: 23.12.2019(UTC) Сообщений: 4
|
Здравствуйте. Использую для подписи PDF документа браузер плагин. К документу в результате создается две открепленные подписи разными сертификатами, одна в браузере, другая на сервере. Если в браузере подпись осуществляется сертификатом с гост 2001 то всё хорошо. Если использовать сертификат с гост 2012 то получаются отличающиеся хеш-суммы по одинаковым алгоритмам (такую ошибку возвращает сторонний сервис, куда отправляется документ). В чем может быть проблема? Подписываю следующим образом Код:
async getHash(data: string): Promise<string> {
const hashData = await (window as any).cadesplugin.CreateObjectAsync(ObjectNamesAsync.CPHashedDataAsync);
// Алгоритм хэширования нужно указать до того, как будут переданы данные
hashData.propset_Algorithm(CAPICOM_HASH_ALGORITHM.CP_GOST_3411_2012_512);
// Указываем кодировку данных
// Кодировка должна быть указана до того, как будут переданы сами данные
// hashData.DataEncoding по умолчанию = 0, это - CADESCOM_CONTENT_ENCODING_TYPE.STRING_TO_UCS2LE
// а на нужно 1, это - CADESCOM_CONTENT_ENCODING_TYPE.BASE64_TO_BINARY;
await hashData.propset_DataEncoding(CADESCOM_CONTENT_ENCODING_TYPE.BASE64_TO_BINARY);
data = Crypto.utoa(data);
hashData.Hash(data);
return hashData.Value;
}
// https://cpdn.cryptopro.ru/content/cades/plugin-samples-sign-cades-bes-async.html
async sign(certificate: ICertificateAsync, dataToSign: string) {
const signer = await (window as any).cadesplugin.CreateObjectAsync(ObjectNamesAsync.CPSignerAsync);
await signer.propset_Certificate(certificate);
const signedData = await (window as any).cadesplugin.CreateObjectAsync(ObjectNamesAsync.CadesSignedDataAsync);
await signedData.propset_Content(dataToSign);
return await signedData.SignCades(signer, CADESCOM_CADES_TYPE.BES, true);
}
Отредактировано пользователем 23 декабря 2019 г. 10:49:28(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,691 Сказал «Спасибо»: 500 раз Поблагодарили: 2044 раз в 1585 постах
|
Здравствуйте. Почему указано CP_GOST_3411_2012_512, а не CP_GOST_3411_2012_256?
У Вас открытый ключ 1024 бит по ГОСТ 2012?
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 23.12.2019(UTC) Сообщений: 4
|
После обнаружения ошибки пробовал указывать CP_GOST_3411_2012_256, ситуация не меняется. При этом для 2001 все работает и на CP_GOST_3411_2012_512 и на CP_GOST_3411_2012_512 ! Открытый ключ 34.10 -2012 256 бит Отредактировано пользователем 24 декабря 2019 г. 8:13:02(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,691 Сказал «Спасибо»: 500 раз Поблагодарили: 2044 раз в 1585 постах
|
В sign необходимо выставить кодировку, потом присвоить base64. По аналогии с кодом хеширования. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 23.12.2019(UTC) Сообщений: 4
|
Не понимаю как это сделать. Вызовы propset_DataEncoding выдают ошибку. В примерах я ничего не нахожу. Где нужно выставлять кодировку?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 23.12.2019(UTC) Сообщений: 4
|
Проблему решил. Для этого: файл, который передается с сервера на подпись читать методом readAsDataURL у FileReader. Далее как в примере удалить текст ";base64," Код:
var header = ";base64,";
var sBase64Data = dataToSign.substr(dataToSign.indexOf(header) + header.length);
далее установить кодировку: Код:
signedData.propset_ContentEncoding(CADESCOM_CONTENT_ENCODING_TYPE.BASE64_TO_BINARY);
Отредактировано пользователем 15 января 2020 г. 13:55:42(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close