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

Уведомление

Icon
Error

6 Страницы<12345>»
Опции
К последнему сообщению К первому непрочитанному
Offline Fomich  
#21 Оставлено : 18 июля 2013 г. 11:06:27(UTC)
Fomich

Статус: Участник

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

Поблагодарили: 2 раз в 2 постах
Кстати, в интернете не нашел реализации гостовской хэш-функции на php с набором параметров как в CryptoPro.
Offline Fomich  
#22 Оставлено : 18 июля 2013 г. 11:09:40(UTC)
Fomich

Статус: Участник

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

Поблагодарили: 2 раз в 2 постах
Автор: dmishin Перейти к цитате
Да, хеш по госту:
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>


А если считать хэш по sha1, и в digestmethod указать, что это sha1. а для signaturemethod указать гост, то ведь тоже должна получиться валидная подпись.
Offline cross  
#23 Оставлено : 18 июля 2013 г. 11:18:25(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
Нет, валидная ГОСТ подпись возвожна только для хеша по ГОСТ алгоритму.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline dmishin  
#24 Оставлено : 18 июля 2013 г. 11:21:10(UTC)
dmishin

Статус: Активный участник

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Автор: Fomich Перейти к цитате
Кстати, в интернете не нашел реализации гостовской хэш-функции на php с набором параметров как в CryptoPro.


Я тоже не встречал реализаций. Пришлось писать обертку вокруг консольного приложения.

Команды для вычисления хеша:

cryptcp -hash -provtype 75 ./input.file -dir /path/to/output/

openssl dgst -md_gost94 -binary -out ./out.file ./input.file

Отредактировано пользователем 18 июля 2013 г. 11:27:09(UTC)  | Причина: Не указана

Offline fomenko  
#25 Оставлено : 18 июля 2013 г. 13:50:38(UTC)
fomenko

Статус: Активный участник

Группы: Участники
Зарегистрирован: 16.07.2013(UTC)
Сообщений: 35
Российская Федерация
Откуда: Пермь

Сказал(а) «Спасибо»: 9 раз
Реализовал следующий алгоритм на C# + Javascript:
1)Подписываю на сервере нужный xml, забираю получившийся SignedInfo



Исходный SignedInfo
Код:

<SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116"><XPath xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">not(ancestor-or-self::dsig:Signature)</XPath></Transform></Transforms><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411" /><DigestValue>wMqeedhkBl4FMJ3bjYZjwLFdkwOsK/a0AaNjt+o+pxk=</DigestValue></Reference></SignedInfo>


2)Часть на C#. генерируем хэш от канокализированного SignedInfo и возвращаем его в виде base64
Код:

public String GenerateSignedInfoHash()
        {
            //исходный signedInfo. кавычки экранированы символами \
            string signedInfo =   "<SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /><SignatureMethod Algorithm=\"urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411\" /><Reference URI=\"\"><Transforms><Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xpath-19991116\"><XPath xmlns:dsig=\"http://www.w3.org/2000/09/xmldsig#\">not(ancestor-or-self::dsig:Signature)</XPath></Transform></Transforms><DigestMethod Algorithm=\"urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411\" /><DigestValue>wMqeedhkBl4FMJ3bjYZjwLFdkwOsK/a0AaNjt+o+pxk=</DigestValue></Reference></SignedInfo>";
            

            XmlDocument signedInfoXml = new XmlDocument();
            signedInfoXml.LoadXml(signedInfo);

            //выолняем канонизация
             XmlDsigC14NTransform xmlTransform = new XmlDsigC14NTransform(false);
             xmlTransform.Algorithm =SignedXml.XmlDsigC14NTransformUrl;
             xmlTransform.LoadInput(signedInfoXml);


            //получаемп хэш по госту
             HashAlgorithm myhash = HashAlgorithm.Create("GOST3411");
             byte[] hashResult =xmlTransform.GetDigestedOutput(myhash);
             string canonicalHashedSignedInfo = Convert.ToBase64String(hashResult);
             return canonicalHashedSignedInfo;
        }


результат выполнения этого метода отдается клиенту

3)Генерация SIgnatureValue на Javascript, на вход приходит результат C# функции
Код:


//генерация SignatureValue
      function generateSignatureValue(base64Hash) {

            var oStore = CreateObject("CAPICOM.Store");
            oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);



            try {
                var certificate = oStore.Certificates.Item(4);

                var hashObject = CreateObject("CAdESCOM.HashedData");
                hashObject.Algorithm = CADESCOM_HASH_ALGORITHM_CP_GOST_3411;
                var temp = utils.stringToHex(B64.decode(base64Hash));
                hashObject.Hash(temp);

                var rawSignature = CreateObject("CAdESCOM.RawSignature");
                var signatureHex = rawSignature.SignHash(hashObject, certificate);

                var reversedSignatureString = utils.reverse(utils.hexToString(signatureHex));

                return B64.encode(reversedSignatureString);

            } catch (e) {
                alert(e);
            }

        };


//вспомогательные функции

        var utils = {

            reverse: function (str) {
                var newStr = '', i;
                for (i = str.length - 1; i >= 0; i--) {
                    newStr += str.charAt(i);
                }
                return newStr;
            },

            d2h: function (d) {
                var res = d.toString(16).toUpperCase();
                if (res.length == 1) {
                    res = '0' + res;
                }
                return res;
            },
            h2d: function (h) {
                return parseInt(h, 16);
            },
            stringToHex: function (string) {
                var hex = '';

                for (var i = 0; i < string.length; i++) {
                    hex += this.d2h(string.charCodeAt(i));
                }
                return hex;
            },
            hexToString: function (hex) {
                var string = '';

                for (var b = 0; b < hex.length; b += 2) {
                    string += String.fromCharCode(parseInt(hex.substr(b, 2), 16));
                }

                return string;
            }
        };




для работы с base64 использую библиотеку
http://jsbase64.codeplex.com/

затем беру подписанный xml и заменяю в нем исходный SignatureValue на полученный от клиента.

Однако подпись проверку на валидность не проходит. В чем может быть ошибка? Всю голову себе уже сломал.




Offline Fomich  
#26 Оставлено : 18 июля 2013 г. 15:33:40(UTC)
Fomich

Статус: Участник

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

Поблагодарили: 2 раз в 2 постах
Нужно брать хэш от base64 encoded значения. Хотя я не знаю как работает xmlTransform.GetDigestedOutput(myhash); Anxious
и еще добавь hashedData.DataEncoding = 0x01;//CADESCOM_BASE64_TO_BINARY;

Отредактировано пользователем 18 июля 2013 г. 15:39:16(UTC)  | Причина: Не указана

Offline fomenko  
#27 Оставлено : 18 июля 2013 г. 15:41:29(UTC)
fomenko

Статус: Активный участник

Группы: Участники
Зарегистрирован: 16.07.2013(UTC)
Сообщений: 35
Российская Федерация
Откуда: Пермь

Сказал(а) «Спасибо»: 9 раз
то есть на сервере мне хэш про госту не брать, только канонизировать SignedInfo, преобразовать в base64 и передать на клиент?
на клиенте надо снова выполнять преобразования к base64 и затем брать хэш? надо ли конвертировать в hex перед взятием хэша?

Отредактировано пользователем 18 июля 2013 г. 15:42:09(UTC)  | Причина: Не указана

Offline Fomich  
#28 Оставлено : 18 июля 2013 г. 15:42:04(UTC)
Fomich

Статус: Участник

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

Поблагодарили: 2 раз в 2 постах
Автор: cross Перейти к цитате
Нет, валидная ГОСТ подпись возвожна только для хеша по ГОСТ алгоритму.


я имел ввиду, что получится валидная подпись, но конечно же она не будет соответствовать ГОСТу
Offline Fomich  
#29 Оставлено : 18 июля 2013 г. 15:46:29(UTC)
Fomich

Статус: Участник

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

Поблагодарили: 2 раз в 2 постах
Автор: fomenko Перейти к цитате
то есть на сервере мне хэш про госту не брать, только канонизировать SignedInfo, преобразовать в base64 и передать на клиент?
на клиенте надо снова выполнять преобразования к base64 и затем брать хэш? надо ли конвертировать в hex перед взятием хэша?


на сервере берешь хэш от base64 encoded SignedInfo. И передаешь клиенту на подпись. На клиенте перед подписью уже не надо будет производить никаких действий

Отредактировано пользователем 18 июля 2013 г. 15:47:49(UTC)  | Причина: Не указана

Offline fomenko  
#30 Оставлено : 18 июля 2013 г. 17:43:16(UTC)
fomenko

Статус: Активный участник

Группы: Участники
Зарегистрирован: 16.07.2013(UTC)
Сообщений: 35
Российская Федерация
Откуда: Пермь

Сказал(а) «Спасибо»: 9 раз
Не могу провести верификацию, проверьте, пожалуйста, кто реализовывал получение SIgnatureValue, получиться ли у вас сгенерировать
корректный SIgnatureValue для данного XML


Поправил алгоритм следующим образом



1)Канонизирую и кодирую в base64 (на сервере)


Код:

 public String GenerateSignedInfoHash()
        {
            //исходный signedInfo. кавычки экранированы символами \
            string signedInfo =   "<SignedInfo>"
+"<CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"/>"
+"<SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411\"/>"
+"<Reference>"
+"<Transforms>"
+"<Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\"/>"
+"</Transforms>"
+"<DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#gostr3411\"/>"
+"<DigestValue>rQRcvnfGVu2YI/ryIGYaeBmwFPtMTYYKudSvD8mzbEs=</DigestValue>"
+"</Reference>"
+"</SignedInfo>";
            
            XmlDocument signedInfoXml = new XmlDocument();
            signedInfoXml.LoadXml(signedInfo);

            //выолняем канонизация
             XmlDsigC14NTransform xmlTransform = new XmlDsigC14NTransform(false);
             xmlTransform.Algorithm =SignedXml.XmlDsigExcC14NTransformUrl;
             xmlTransform.LoadInput(signedInfoXml);
             MemoryStream memoryStream = (MemoryStream)xmlTransform.GetOutput();
            string canonicalSignedInfo = Convert.ToBase64String(memoryStream.ToArray());
            return canonicalSignedInfo;
        }


на выходе получаю канонизированный SignedInfo в Base64:
PFNpZ25lZEluZm8+PENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiPjwvQ2Fub25pY2FsaXphdGlvbk1ldGhvZD48U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxkc2lnLW1vcmUjZ29zdHIzNDEwMjAwMS1nb3N0cjM0MTEiPjwvU2lnbmF0dXJlTWV0aG9kPjxSZWZlcmVuY2U+PFRyYW5zZm9ybXM+PFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIj48L1RyYW5zZm9ybT48L1RyYW5zZm9ybXM+PERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZHNpZy1tb3JlI2dvc3RyMzQxMSI+PC9EaWdlc3RNZXRob2Q+PERpZ2VzdFZhbHVlPnJRUmN2bmZHVnUyWUkvcnlJR1lhZUJtd0ZQdE1UWVlLdWRTdkQ4bXpiRXM9PC9EaWdlc3RWYWx1ZT48L1JlZmVyZW5jZT48L1NpZ25lZEluZm8+

Отредактировано пользователем 18 июля 2013 г. 17:56:39(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
6 Страницы<12345>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.