Статус: Новичок
Группы: Участники
Зарегистрирован: 22.12.2021(UTC) Сообщений: 9  Сказал(а) «Спасибо»: 3 раз
|
Здравствуйте! Мне необходимо подписывать хэш, который приходит мне без самих данных. Я использовал метод CadesSignedData.SignHash(). Но дело в том, что он как аргумент HashedData - тип из CAPICOM. Но этот тип можно инстанцировать, хэшируя исходные данные и нельзя из готового хэша. Также имеется тип CPHashedData, объект которого можно создать из имеющегося хэша. Однако, он не приводится явно к типу HashedData . не могли бы вы подсказать, как я могу подписать имеющийся хэш
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 889  Сказал(а) «Спасибо»: 74 раз Поблагодарили: 191 раз в 186 постах
|
Добрый день! на выходе какая подпись нужна? raw или cms? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.12.2021(UTC) Сообщений: 9  Сказал(а) «Спасибо»: 3 раз
|
Автор: Санчир Момолдаев  Добрый день! на выходе какая подпись нужна? raw или cms? Нужна подпись в формате CADES BES, которую нужно сериализовать и отправить на сервер, где она будет валидироваться.
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 889  Сказал(а) «Спасибо»: 74 раз Поблагодарили: 191 раз в 186 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.12.2021(UTC) Сообщений: 9  Сказал(а) «Спасибо»: 3 раз
|
Автор: Санчир Момолдаев  Это да. Но метод подписывания хэша имеет другой тип данных(HashedData) и явное приведение типов не работает(см. вложенный скрин)
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 889  Сказал(а) «Спасибо»: 74 раз Поблагодарили: 191 раз в 186 постах
|
инстанцируете HashedData, задаете значение хэша SetHashValue, подписываете .SignHash |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.12.2021(UTC) Сообщений: 9  Сказал(а) «Спасибо»: 3 раз
|
Автор: Санчир Момолдаев  инстанцируете HashedData, задаете значение хэша SetHashValue, подписываете .SignHash В том то и дело, что в HashedData нет этого метода -https://docs.microsoft.com/en-us/windows/win32/seccrypto/hasheddata Он есть в CpHashedData. Но CadesSignedData.SignHash() принимает именно HashedData
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 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);
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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);
Большое спасибо! Буду пробовать
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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);
Приведение типов работает, но теперь появился вопрос. Здесь алгоритм хэширования указан явно, а мне нужно брать его из сертификата. Не подскажите. как это можно сделать, используя данную библиотеку?
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
 1 пользователь поблагодарил two_oceans за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close