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

Уведомление

Icon
Error

3 Страницы<123
Опции
К последнему сообщению К первому непрочитанному
Offline dmishin  
#21 Оставлено : 12 июля 2013 г. 6:14:33(UTC)
dmishin

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Автор: Новожилова Елена Перейти к цитате
CAdES-BES - это формат подписанного CMS-сообщения. И значение подписи в нем вычисляется не на сам документ, а на подписываемые атрибуты (среди которых обязательно присутствует хэш-значение документа).
Подписываемые атрибуты в сообщении CAdES-BES должны присутствовать обязательно.

В то же время подпись в сообщении XMLDSig вычисляется на приведенный к каноническому виду узел SignedInfo, который также содержит в своем составе хэш-значение документа.

Вывод - значение подписи в сообщениях CAdES-BES и XMLDSig вычисляется на _разные_ данные.

Теоретически, если бы не было подписанных атрибутов, то можно было бы просить пользователя подписывать заранее сформированный и приведенный к каноническому виду узел SignedInfo. Но поскольку наличие атрибутов является обязательным требованием, то описанный вами способ невозможен.

Опытным путем пришел к тому же выводу...
Offline dmishin  
#22 Оставлено : 12 июля 2013 г. 8:43:59(UTC)
dmishin

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Если кому интересно, то получилось создать значение SignatureValue с помощью openssl:
(openssl-1.0.1c с настроенным гост алгоритмом)
openssl pkeyutl -sign -in binary_gost.hash -inkey private_key.pem -out testfile.sig
base64 testfile.sig

Отредактировано пользователем 12 июля 2013 г. 8:44:35(UTC)  | Причина: Не указана

Offline zhenia  
#23 Оставлено : 20 октября 2017 г. 14:56:49(UTC)
zhenia

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

Группы: Участники
Зарегистрирован: 18.09.2017(UTC)
Сообщений: 8
Мужчина
Российская Федерация
Откуда: ЦПС

Сказал «Спасибо»: 1 раз
Здравствуйте!
Я так же пытаюсь выполнить подписывание XML в браузере, но подпись не проходит проверку с сообщением: ЭЦП не подтверждена: Ошибка проверки ЭП: Нарушена целостность ЭП

Собственно остался последний шаг - получить валидную подпись блока 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 URI="#SIGNED_BY_CALLER"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><Transform Algorithm="urn://smev-gov-ru/xmldsig/transform" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" /><DigestValue></DigestValue></Reference></SignedInfo>


Вот с хэшем от подписываемых данных:
Код:

<SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"></SignatureMethod><Reference URI="#SIGNED_BY_CALLER"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform><Transform Algorithm="urn://smev-gov-ru/xmldsig/transform"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"></DigestMethod><DigestValue>ZE88vJ4ug+xer4OUfd+IjIbDVrO2xbF6eQbwp5Htnm8=</DigestValue></Reference></SignedInfo>


Хэш совпадает с тем что выдает программа на C#. Кстати там подписанная XML проходит проверку.

Код:

createObject( 'CAdESCOM.RawSignature', function( err, oRawSignature ) {
    if ( err ) {
        callback( err );
    }

    createObject( 'CAdESCOM.HashedData', function( err, hashObject ) {
        if ( err ) {
            callback( err );
        }

        hashValue = Base64.decode( hashValue );

        hashObject.propset_Algorithm( cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411 ).then( function() {
            hashObject.propset_DataEncoding( cadesplugin.CADESCOM_BASE64_TO_BINARY ).then( function() {
                hashObject.SetHashValue( hashValue ).then( function() {
                    oRawSignature.SignHash( hashObject, oCert ).then( function( sRawSignature ) {
                        sRawSignature = Base64.encode( utils.reverse( utils.hexToString( sRawSignature ) ) );
                        callback( null, sRawSignature );
                    }, callback);
                }, callback);
            }, callback);
        }, callback);

    });
});


Пробовал заменить преобразование подписи:
Код:

var ut = {

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

        hex : {
            d2h : function(d) {
                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 : {
            _keyStr : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',

            // public method for encoding
            encode : function (input) {
                var output = '';
                var chr1, chr2, chr3 = "";
                var enc1, enc2, enc3, enc4 = "";
                var i = 0;

                do {
                    chr1 = input.charCodeAt(i++);
                    chr2 = input.charCodeAt(i++);
                    chr3 = input.charCodeAt(i++);

                    enc1 = chr1 >> 2;
                    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                    enc4 = chr3 & 63;

                    if ( isNaN(chr2) ) {
                        enc3 = enc4 = 64;
                    } else if (isNaN(chr3)) {
                        enc4 = 64;
                    }

                    output = output +
                        this._keyStr.charAt(enc1) +
                        this._keyStr.charAt(enc2) +
                        this._keyStr.charAt(enc3) +
                        this._keyStr.charAt(enc4);
                    chr1 = chr2 = chr3 = '';
                    enc1 = enc2 = enc3 = enc4 = '';
                } while (i < input.length);

                return output;
            },

            // public method for decoding
            decode : function (input) {
                var output = '';
                var chr1, chr2, chr3 = '';
                var enc1, enc2, enc3, enc4 = '';
                var i = 0;

                var base64test = /[^A-Za-z0-9\+\/\=]/g;
                if (base64test.exec(input)) {
                    return null;
                }

                do {
                    enc1 = this._keyStr.indexOf(input.charAt(i++));
                    enc2 = this._keyStr.indexOf(input.charAt(i++));
                    enc3 = this._keyStr.indexOf(input.charAt(i++));
                    enc4 = this._keyStr.indexOf(input.charAt(i++));

                    chr1 = (enc1 << 2) | (enc2 >> 4);
                    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                    chr3 = ((enc3 & 3) << 6) | enc4;

                    output = output + String.fromCharCode(chr1);

                    if (enc3 != 64) {
                        output = output + String.fromCharCode(chr2);
                    }
                    if (enc4 != 64) {
                        output = output + String.fromCharCode(chr3);
                    }

                    chr1 = chr2 = chr3 = '';
                    enc1 = enc2 = enc3 = enc4 = '';

                } while (i < input.length);

                return output;
            }
        }

};

// преобразование подписи перед вставкой в XML так:
sRawSignature = ut.base64.encode( ut.reverse( ut.hex.hexToString( sRawSignature ) ) );


Предыстория в теме "ЭЦП Browser plug-in подпись XML по ГОСТу".

В чем может быть проблема?

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