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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Андрей C  
#1 Оставлено : 22 декабря 2021 г. 14:06:35(UTC)
astarukhin

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

Группы: Участники
Зарегистрирован: 22.12.2021(UTC)
Сообщений: 9
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Здравствуйте! Мне необходимо подписывать хэш, который приходит мне без самих данных. Я использовал метод CadesSignedData.SignHash(). Но дело в том, что он как аргумент HashedData - тип из CAPICOM. Но этот тип можно инстанцировать, хэшируя исходные данные и нельзя из готового хэша. Также имеется тип CPHashedData, объект которого можно создать из имеющегося хэша. Однако, он не приводится явно к типу HashedData . не могли бы вы подсказать, как я могу подписать имеющийся хэш
Offline Санчир Момолдаев  
#2 Оставлено : 27 декабря 2021 г. 7:49:16(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 74 раз
Поблагодарили: 191 раз в 186 постах
Добрый день!
на выходе какая подпись нужна? raw или cms?
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей C  
#3 Оставлено : 27 декабря 2021 г. 8:00:37(UTC)
astarukhin

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

Группы: Участники
Зарегистрирован: 22.12.2021(UTC)
Сообщений: 9
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Автор: Санчир Момолдаев Перейти к цитате
Добрый день!
на выходе какая подпись нужна? raw или cms?


Нужна подпись в формате CADES BES, которую нужно сериализовать и отправить на сервер, где она будет валидироваться.
Offline Санчир Момолдаев  
#4 Оставлено : 27 декабря 2021 г. 8:08:09(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 74 раз
Поблагодарили: 191 раз в 186 постах
Цитата:
Но этот тип можно инстанцировать, хэшируя исходные данные и нельзя из готового хэша

можно задать значение хэша
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей C  
#5 Оставлено : 27 декабря 2021 г. 8:47:02(UTC)
astarukhin

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

Группы: Участники
Зарегистрирован: 22.12.2021(UTC)
Сообщений: 9
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Автор: Санчир Момолдаев Перейти к цитате
Цитата:
Но этот тип можно инстанцировать, хэшируя исходные данные и нельзя из готового хэша

можно задать значение хэша

Это да. Но метод подписывания хэша имеет другой тип данных(HashedData) и явное приведение типов не работает(см. вложенный скрин)
Offline Санчир Момолдаев  
#6 Оставлено : 27 декабря 2021 г. 9:15:37(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 74 раз
Поблагодарили: 191 раз в 186 постах
инстанцируете HashedData, задаете значение хэша SetHashValue, подписываете .SignHash
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей C  
#7 Оставлено : 27 декабря 2021 г. 9:25:39(UTC)
astarukhin

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

Группы: Участники
Зарегистрирован: 22.12.2021(UTC)
Сообщений: 9
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Автор: Санчир Момолдаев Перейти к цитате
инстанцируете HashedData, задаете значение хэша SetHashValue, подписываете .SignHash


В том то и дело, что в HashedData нет этого метода -https://docs.microsoft.com/en-us/windows/win32/seccrypto/hasheddata
Он есть в CpHashedData. Но CadesSignedData.SignHash() принимает именно HashedData
Offline Санчир Момолдаев  
#8 Оставлено : 27 декабря 2021 г. 10:02:10(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 74 раз
Поблагодарили: 191 раз в 186 постах
просто приведите типы.

Код:
            var hash1 = new CPHashedData();
            hash1.Algorithm = (CAPICOM_HASH_ALGORITHM) CADESCOM_HASH_ALGORITHM.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
            hash1.DataEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY;
            hash1.Hash(Convert.ToBase64String(Encoding.UTF8.GetBytes("data")));
            var hashValue = hash1.Value;
            Console.WriteLine(hashValue);

            var hash2 = new CPHashedData();
            hash2.Algorithm = (CAPICOM_HASH_ALGORITHM)CADESCOM_HASH_ALGORITHM.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
            hash2.SetHashValue(hashValue);

            var signHashValue = new CadesSignedData();
            signHashValue.ContentEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY;
            string detached = signHashValue.SignHash((HashedData)hash2, oSigner, CADESCOM_CADES_TYPE.CADESCOM_CADES_BES);

            Console.WriteLine(detached);
            File.WriteAllText("c:/work/signhash.txt.sig", detached);

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей C  
#9 Оставлено : 27 декабря 2021 г. 10:06:57(UTC)
astarukhin

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

Группы: Участники
Зарегистрирован: 22.12.2021(UTC)
Сообщений: 9
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Автор: Санчир Момолдаев Перейти к цитате
просто приведите типы.

Код:
            var hash1 = new CPHashedData();
            hash1.Algorithm = (CAPICOM_HASH_ALGORITHM) CADESCOM_HASH_ALGORITHM.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
            hash1.DataEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY;
            hash1.Hash(Convert.ToBase64String(Encoding.UTF8.GetBytes("data")));
            var hashValue = hash1.Value;
            Console.WriteLine(hashValue);

            var hash2 = new CPHashedData();
            hash2.Algorithm = (CAPICOM_HASH_ALGORITHM)CADESCOM_HASH_ALGORITHM.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
            hash2.SetHashValue(hashValue);

            var signHashValue = new CadesSignedData();
            signHashValue.ContentEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY;
            string detached = signHashValue.SignHash((HashedData)hash2, oSigner, CADESCOM_CADES_TYPE.CADESCOM_CADES_BES);

            Console.WriteLine(detached);
            File.WriteAllText("c:/work/signhash.txt.sig", detached);


Большое спасибо! Буду пробовать
Offline astarukhin  
#10 Оставлено : 10 января 2022 г. 14:39:59(UTC)
astarukhin

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

Группы: Участники
Зарегистрирован: 22.12.2021(UTC)
Сообщений: 9
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Автор: Санчир Момолдаев Перейти к цитате
просто приведите типы.

Код:
            var hash1 = new CPHashedData();
            hash1.Algorithm = (CAPICOM_HASH_ALGORITHM) CADESCOM_HASH_ALGORITHM.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
            hash1.DataEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY;
            hash1.Hash(Convert.ToBase64String(Encoding.UTF8.GetBytes("data")));
            var hashValue = hash1.Value;
            Console.WriteLine(hashValue);

            var hash2 = new CPHashedData();
            hash2.Algorithm = (CAPICOM_HASH_ALGORITHM)CADESCOM_HASH_ALGORITHM.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
            hash2.SetHashValue(hashValue);

            var signHashValue = new CadesSignedData();
            signHashValue.ContentEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY;
            string detached = signHashValue.SignHash((HashedData)hash2, oSigner, CADESCOM_CADES_TYPE.CADESCOM_CADES_BES);

            Console.WriteLine(detached);
            File.WriteAllText("c:/work/signhash.txt.sig", detached);



Приведение типов работает, но теперь появился вопрос. Здесь алгоритм хэширования указан явно, а мне нужно брать его из сертификата. Не подскажите. как это можно сделать, используя данную библиотеку?
Offline two_oceans  
#11 Оставлено : 10 января 2022 г. 20:54:12(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,536
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 105 раз
Поблагодарили: 375 раз в 354 постах
Добрый день.
Цитата:
Здесь алгоритм хэширования указан явно, а мне нужно брать его из сертификата. Не подскажите. как это можно сделать, используя данную библиотеку?
Поскольку здесь речь о подписи по полученному извне хэшу, то есть шанс попасть в неприятную ситуацию, когда длина хэша одинаковая, но алгоритм разный. В этом случае (если алгоритм подогнан по сертификату) подписание пройдет без ошибок, но при проверке будет как бы неверный хэш.

Вариант 1. Алгоритм должен передаваться вместе со значением хэша от hash1 (сервер) в hash2(клиент, где подписываете). Если алгоритм не подходит под сертификат - должна вываливаться ошибка подписания. Собственно, особой проверки не нужно, криптопровайдер выдаст ошибку если алгоритмы хэша и ключевой пары несовместимы. В итоге, Вам не нужно смотреть сертификат - просто честно передать алгоритм хэша от сервера в hash2 (и выдать внятное описание ошибки пользователю). Это не очень поможет пользователю, если сервер дает хэш несовместимый с его сертификатом, но предотвратит трудно диагностируемые ошибки подписи из-за неверного алгоритма.

Вариант 2. Смотрите в имеющемся сертификате алгоритм и запрашиваете от сервера нужный хэш. Это делает необязательным (но все еще желательным) шагом передачу алгоритма хэша от hash1 (сервер) в hash2(клиент, где подписываете). Тут уже сервер должен вываливать ошибку, если не может предоставить такой хэш.

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

В случае гост каждому алгоритму подписи соответствует только один алгоритм открытого ключа и один алгоритм хэша. Однако надо ориентироваться на поле алгоритма открытого ключа, так как если используете тестовые сертификаты, то алгоритм хэша конечного сертификата соответствует ключу УЦ и может не соответствовать алгоритму открытого ключа. Был примерно такой код в одной из тем (действие - проверку полученного от сервера алгоритма хэша или жесткое указание алгоритма - добавьте по вкусу):
Код:
    var pubKey = certObject.PublicKey();
    var algo = pubKey.Algorithm;
    var algoOid = algo.Value;
    if (algoOid == "1.2.643.7.1.1.1.1") {   // алгоритм подписи ГОСТ Р 34.10-2012 с ключом 256 бит 
    }
    else if (algoOid == "1.2.643.7.1.1.1.2") {   // алгоритм подписи ГОСТ Р 34.10-2012 с ключом 512 бит 
    }
    else if (algoOid == "1.2.643.2.2.19") {  // алгоритм ГОСТ Р 34.10-2001 
    }
Примечание 2. Это оиды, используемые КриптоПро. В случае сертификатов для других отечественных криптопровайдеров, нужно добавить их специфичные оиды. Может потребоваться дополнительная обработка хэша.

Отредактировано пользователем 10 января 2022 г. 21:25:20(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
astarukhin оставлено 11.01.2022(UTC)
Offline astarukhin  
#12 Оставлено : 11 января 2022 г. 5:58:43(UTC)
astarukhin

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

Группы: Участники
Зарегистрирован: 22.12.2021(UTC)
Сообщений: 9
Российская Федерация

Сказал(а) «Спасибо»: 3 раз
Автор: two_oceans Перейти к цитате
Добрый день.
Цитата:
Здесь алгоритм хэширования указан явно, а мне нужно брать его из сертификата. Не подскажите. как это можно сделать, используя данную библиотеку?
Поскольку здесь речь о подписи по полученному извне хэшу, то есть шанс попасть в неприятную ситуацию, когда длина хэша одинаковая, но алгоритм разный. В этом случае (если алгоритм подогнан по сертификату) подписание пройдет без ошибок, но при проверке будет как бы неверный хэш.

Вариант 1. Алгоритм должен передаваться вместе со значением хэша от hash1 (сервер) в hash2(клиент, где подписываете). Если алгоритм не подходит под сертификат - должна вываливаться ошибка подписания. Собственно, особой проверки не нужно, криптопровайдер выдаст ошибку если алгоритмы хэша и ключевой пары несовместимы. В итоге, Вам не нужно смотреть сертификат - просто честно передать алгоритм хэша от сервера в hash2 (и выдать внятное описание ошибки пользователю). Это не очень поможет пользователю, если сервер дает хэш несовместимый с его сертификатом, но предотвратит трудно диагностируемые ошибки подписи из-за неверного алгоритма.

Вариант 2. Смотрите в имеющемся сертификате алгоритм и запрашиваете от сервера нужный хэш. Это делает необязательным (но все еще желательным) шагом передачу алгоритма хэша от hash1 (сервер) в hash2(клиент, где подписываете). Тут уже сервер должен вываливать ошибку, если не может предоставить такой хэш.

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

В случае гост каждому алгоритму подписи соответствует только один алгоритм открытого ключа и один алгоритм хэша. Однако надо ориентироваться на поле алгоритма открытого ключа, так как если используете тестовые сертификаты, то алгоритм хэша конечного сертификата соответствует ключу УЦ и может не соответствовать алгоритму открытого ключа. Был примерно такой код в одной из тем (действие - проверку полученного от сервера алгоритма хэша или жесткое указание алгоритма - добавьте по вкусу):
Код:
    var pubKey = certObject.PublicKey();
    var algo = pubKey.Algorithm;
    var algoOid = algo.Value;
    if (algoOid == "1.2.643.7.1.1.1.1") {   // алгоритм подписи ГОСТ Р 34.10-2012 с ключом 256 бит 
    }
    else if (algoOid == "1.2.643.7.1.1.1.2") {   // алгоритм подписи ГОСТ Р 34.10-2012 с ключом 512 бит 
    }
    else if (algoOid == "1.2.643.2.2.19") {  // алгоритм ГОСТ Р 34.10-2001 
    }
Примечание 2. Это оиды, используемые КриптоПро. В случае сертификатов для других отечественных криптопровайдеров, нужно добавить их специфичные оиды. Может потребоваться дополнительная обработка хэша.


спасибо!

Отредактировано пользователем 11 января 2022 г. 5:59:43(UTC)  | Причина: Не указана

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