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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline mpnj  
#1 Оставлено : 16 декабря 2024 г. 16:44:57(UTC)
mpnj

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

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

Сказал(а) «Спасибо»: 1 раз
Всем привет)

Существует ли возможность получить с помощью браузерного плагина обычную откреплённую подпись по хэшу файла? (алгоритм хэширования вроде должен совпадать с алгоритмом из сертификата, да?)
Причём подпись должна быть такая, что для её валидации требуется именно исходный файл, а не его хэш.

(как раз пример, где для валидации требуется хэш, я вполне себе нашёл, как и пример, где подписывается не хэш, а содержимое файла в формате base64-строки)
Online Андрей *  
#2 Оставлено : 16 декабря 2024 г. 17:49:32(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,684
Мужчина
Российская Федерация

Сказал «Спасибо»: 572 раз
Поблагодарили: 2302 раз в 1803 постах
Здравствуйте.

Конечно, есть и пример в документации.
Техническую поддержку оказываем тут
Наша база знаний
Online Андрей *  
#3 Оставлено : 16 декабря 2024 г. 17:50:34(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,684
Мужчина
Российская Федерация

Сказал «Спасибо»: 572 раз
Поблагодарили: 2302 раз в 1803 постах
только CADESCOM_HASH_ALGORITHM_CP_GOST_3411
подправить на CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256

cadescom_hash_algorithm
Техническую поддержку оказываем тут
Наша база знаний
Offline mpnj  
#4 Оставлено : 17 декабря 2024 г. 8:49:58(UTC)
mpnj

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате
Здравствуйте.

Конечно, есть и пример в документации.


Извиняюсь, а можете докинуть пример, как теперь результат работы этой функции подписать? Хотя бы ключевые моменты.

Потому что я пробовал два варианта:
1. Через SignCades(по мотивам примеров в вашей базе знаний):

Цитата:


// Создаем объект CAdESCOM.HashedData
var oHashedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.HashedData");

// Алгоритм хэширования нужно указать до того, как будут переданы данные
yield oHashedData.propset_Algorithm(cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256);

// Указываем кодировку данных
// Кодировка должна быть указана до того, как будут переданы сами данные
yield oHashedData.propset_DataEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);

// Предварительно закодированные в BASE64 бинарные данные
// В данном случае закодирован файл со строкой "Some Data."
var dataInBase64 = "U29tZSBEYXRhLg==";

// Передаем данные
yield oHashedData.Hash(dataInBase64);

// Получаем хэш-значение
var sHashValue = yield oHashedData.Value;

const oStore = yield cadesplugin.CreateObjectAsync('CAdESCOM.Store');
yield oStore.Open();

const oCertificates = yield oStore.Certificates;
const oCertificate = yield oCertificates.Item(5); // получаю нужный мне сертификат

const oSigner = yield cadesplugin.CreateObjectAsync('CAdESCOM.CPSigner');
yield oSigner.propset_Certificate(oCertificate);
yield oSigner.propset_CheckCertificate(true);

const oSignedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.CadesSignedData');
yield oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
yield oSignedData.propset_Content(sHashValue);

let sSignedMessage = '';
try {
sSignedMessage = yield oSignedData.SignCades(oSigner, cadesplugin.CADESCOM_CADES_BES, true);
} catch (err) {
const e = cadesplugin.getLastError(err);
console.log('Failed to create signature. Error: ' + e);
}

yield oStore.Close();
return console.log(`sign: ${sSignedMessage}`);


Результат: результирующая строка визуально подходит под нужный формат, но валидация подписи на гос.услугах выдаёт сообщение о том, что подпись невалидна. В принципе у меня есть впечатление, что в этом случае я подписал как бы файл, где в качестве содержимого не исходные данные, а хэш от них.

2. Пробовал через подписывание хэша(опять же из ваших примеров):

Цитата:


const oStore = yield cadesplugin.CreateObjectAsync('CAdESCOM.Store');
yield oStore.Open();
const oCertificates = yield oStore.Certificates;
const oCertificate = yield oCertificates.Item(5);123456

// Создаем объект CAdESCOM.HashedData
var oHashedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.HashedData");

// Алгоритм хэширования нужно указать до того, как будут переданы данные
yield oHashedData.propset_Algorithm(cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256);

// Указываем кодировку данных
// Кодировка должна быть указана до того, как будут переданы сами данные
yield oHashedData.propset_DataEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);

// Предварительно закодированные в BASE64 бинарные данные
// В данном случае закодирован файл со строкой "Some Data."
var dataInBase64 = "U29tZSBEYXRhLg==";

// Передаем данные
yield oHashedData.Hash(dataInBase64);

// Получаем хэш-значение
var sHashValue = yield oHashedData.Value;

// Создаем объект CAdESCOM.RawSignature
const oRawSignature = yield cadesplugin.CreateObjectAsync('CAdESCOM.RawSignature');

// Вычисляем значение подписи

const sRawSignature = yield oRawSignature.SignHash(oHashedData, oCertificate);
console.log(sRawSignature);

Результат: ожидаемо получаю подпись, для валидации которой требуется хэш файла.



Я что-то явно делаю не так)
Повторюсь, мне нужно передать на вход хэш и получить на выходе стандартную подпись, которая проверяется без хэша файла.

Отредактировано пользователем 17 декабря 2024 г. 8:50:57(UTC)  | Причина: Не указана

Online Андрей *  
#5 Оставлено : 17 декабря 2024 г. 12:56:03(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,684
Мужчина
Российская Федерация

Сказал «Спасибо»: 572 раз
Поблагодарили: 2302 раз в 1803 постах
что было в варианте 1? какая ошибка? В Инструментах КриптоПро тоже выдалась ошибка?


Цитата:
// В данном случае закодирован файл со строкой "Some Data."
var dataInBase64 = "U29tZSBEYXRhLg==";


что проверялось?

Some Data.
в файле - 10 байт? или там еще и пару байт лишних?
Техническую поддержку оказываем тут
Наша база знаний
Offline mpnj  
#6 Оставлено : 17 декабря 2024 г. 14:35:20(UTC)
mpnj

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате
что было в варианте 1? какая ошибка? В Инструментах КриптоПро тоже выдалась ошибка?


Цитата:
// В данном случае закодирован файл со строкой "Some Data."
var dataInBase64 = "U29tZSBEYXRhLg==";


что проверялось?

Some Data.
в файле - 10 байт? или там еще и пару байт лишних?



да, в файле 10 байт, только текст из примера.

гос.услуги выдают:

Цитата:
Подпись 1
Статус ЭП
Электронная подпись неверна

Статус сертификата ЭП
Не проверялся

Владелец сертификата
C=RU, ST=тест, L=тест, O=тест, OU=тест, CN=тест2 тест2 тес3 тест4 тест5, E=xn--e1aybc

Издатель сертификата
CN=CRYPTO-PRO Test Center 2, O=CRYPTO-PRO LLC, L=Moscow, C=RU, E=support@cryptopro.ru

Серийный номер
120066858774222B74522BE38C000200668587

Отпечаток
8B15D6AEAB671D480E11E1A78C91716D569FB3AD

Действует
с 20.11.2024 по 20.01.2025


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


Инструменты криптоПро выдают такое:

Цитата:

Подпись 1/1:
Ошибка при проверке (0x80091007: Неправильное значение хеша.)
Статус проверки: Сообщение содержит неверную подпись.
Тип подписи: CAdES-BES
Cубъект: E=xn--e1aybc, CN=тест2 тест2 тес3 тест4 тест5, OU=тест, O=тест, L=тест, S=тест, C=RU
Отпечаток: 8B15D6AEAB671D480E11E1A78C91716D569FB3AD
Время подписания: 17/12/2024 05:27:58 UTC
Цепочка: CRYPTO-PRO Test Center 2 → тест2 тест2 тес3 тест4 тест5




А у вас нет какого-нибудь цельного примера, который бы работал хотя бы на вашей машине?

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

Offline mpnj  
#7 Оставлено : 19 декабря 2024 г. 9:56:58(UTC)
mpnj

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате
что было в варианте 1? какая ошибка? В Инструментах КриптоПро тоже выдалась ошибка?


Цитата:
// В данном случае закодирован файл со строкой "Some Data."
var dataInBase64 = "U29tZSBEYXRhLg==";


что проверялось?

Some Data.
в файле - 10 байт? или там еще и пару байт лишних?



Ну и вообще во всех примерах про подпись хэша верификация тоже происходит по хэшу, тогда как должна была бы происходить по исходной строке base64(если всё же можно обойтись без хеша при валидации).

Точно ли это возможно сделать с помощью плагина? Может эта функция доступна только из SDK на бэке? Вроде где-то на форуме видел примеры для C#, в которых специальный флажок использовался при создании подписи, чтобы сказать, что подписывается уже хэш и его дополнительно хэшировать не нужно. Тогда как для плагина ничего похожего найти не могу.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.