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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Sveyvil  
#1 Оставлено : 22 сентября 2015 г. 16:36:45(UTC)
Sveyvil

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

Группы: Участники
Зарегистрирован: 06.08.2012(UTC)
Сообщений: 4
Откуда: Moscow

Здравствуйте!
Возникла следующая проблема
При проверке подписи через .Net созданной через JCP возвращается отрицательный результат(подпись не валидна).
При проверке подписи в JCP результат положительный(подпись валидна).
Использовались пример из .NET SimpleCS(Xml.Verify) и слегка модифицированные примеры из JCP.
Нашел в xml документе часть строки из-за которой происходит это расхождение(при подписании получаются разные значения DigestValue).
Пример и классы во вложении. attach.zip (5kb) загружен 9 раз(а).
Можете подсказать в какой именно реализации ошибка, и что можно с этим сделать?
Используемое ПО:
КриптоПро CSP: 3.6.7777
КриптоПро .NET: 1.0.4812.0
КриптоПро JCP: 2.0.38481
Java: 1.7.0_67
Пакеты: serializer-2.9.1, xmlsec-1.5.2, xalan-2.7.1, org.apache.commons.logging;version="1.1.1"
Offline Павел Смирнов  
#2 Оставлено : 22 сентября 2015 г. 19:36:59(UTC)
Павел Смирнов

Статус: Вам и не снилось

Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 831
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
В .NET выставлено свойство PreserveWhiteSpace = true?
Техническую поддержку оказываем тут.
Наша база знаний.
Offline Sveyvil  
#3 Оставлено : 23 сентября 2015 г. 9:29:26(UTC)
Sveyvil

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

Группы: Участники
Зарегистрирован: 06.08.2012(UTC)
Сообщений: 4
Откуда: Moscow

Да, естественно выставлен, код можно посмотреть в примерах по SDK .NET.
Без символа перевода каретки /r(
) все работает нормально, и в .NET и в java подпись проверяется.
Offline Павел Смирнов  
#4 Оставлено : 24 сентября 2015 г. 10:57:43(UTC)
Павел Смирнов

Статус: Вам и не снилось

Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 831
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
Соберите логи с .NET и Java при создании и проверке подписи.

Для .NET добавьте в конфигурацию приложения:
Код:
    <system.diagnostics>
        <sources>
            <source name="System.Security.Cryptography.Xml.SignedXml"
                    switchName="XmlDsigLogSwitch">
                <listeners>
                    <add name="logFile" />
                </listeners>
            </source>
        </sources>
        <switches>
            <add name="XmlDsigLogSwitch" value="Verbose" />
        </switches>
        <sharedListeners>
            <add name="logFile"
                 type="System.Diagnostics.TextWriterTraceListener"
                 initializeData="c:\temp\NETXmlDsigLog.txt"/>
        </sharedListeners>
        <trace autoflush="true">
            <listeners>
                <add name="logFile" />
            </listeners>
        </trace>
    </system.diagnostics>


Для Java см. инструкции здесь: http://www.mkyong.com/logging/log4j-log4j-properties-examples/.

Надо, чтобы в логах отпечаталось канонизированное представление подписываемого узла, которое идёт на вход хэш-функции. И выложите логи сюда посмотреть.
Техническую поддержку оказываем тут.
Наша база знаний.
Offline Sveyvil  
#5 Оставлено : 25 сентября 2015 г. 13:27:28(UTC)
Sveyvil

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

Группы: Участники
Зарегистрирован: 06.08.2012(UTC)
Сообщений: 4
Откуда: Moscow

SimpleCS.log.txt (7kb) загружен 10 раз(а). XMLDsig.log.txt (13kb) загружен 9 раз(а).
Выложил.
Собственно вопрос то где-ошибка скорее всего? и что можно сделать.
Просто когда я пробовал подписывать на .net, для данных с \r и с \r\n получается одинаковый хэш. а когда пробовал получать отдельно результат канокализации, то байты были одинаковыми.
Offline cryptoproLogin  
#6 Оставлено : 25 сентября 2015 г. 14:12:04(UTC)
cryptoproLogin

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

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

Столкнулся с той же проблемой.

Причины было две:

1)В XmlDsigExcC14NTransform как-то странно реализован метод GetDigestedOutput используемый при вычислении хеша от SignedInfo. Я этот метод переопределил на следующий:
Код:

public class CustomXmlDsigExcC14NTransform : XmlDsigExcC14NTransform
{
    public override byte[] GetDigestedOutput(HashAlgorithm hash)
    {
        using (var s = new BinaryReader((Stream)this.GetOutput()))
        {
            var xmlBytes = s.ReadBytes((int) s.BaseStream.Length);
            var xmlString = Encoding.UTF8.GetString(xmlBytes);
            xmlBytes = Encoding.UTF8.GetBytes(xmlString);
            hash.ComputeHash(xmlBytes);
            return hash.Hash;
        }
    }
}


2) Криптопро JSP использует SignatureValue реверсивном порядке. Пришлось и мне делать реверс. см. http://www.cryptopro.ru/....aspx?g=posts&m=2338

(Кто-нибудь может объяснить зачем они это делают? Brick wall )
Offline Sveyvil  
#7 Оставлено : 1 октября 2015 г. 11:30:57(UTC)
Sveyvil

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

Группы: Участники
Зарегистрирован: 06.08.2012(UTC)
Сообщений: 4
Откуда: Moscow

Причина точно не в этом, потому что уже в DigestValue другое значение, а оно рассчитывается до выполнения GetDigestedOutput.
Разница возникает перед тем как производятся трансформации в SignedXml.
Собственно перед трансформациями делается вызов следующего метода из класса System.Security.Cryptography.Xml.Utils
Код:

internal static XmlDocument PreProcessDocumentInput(XmlDocument document, XmlResolver xmlResolver, string baseUri)
        {
            if (document == null)
            {
                throw new ArgumentNullException("document");
            }
            MyXmlDocument document2 = new MyXmlDocument {
                PreserveWhitespace = document.PreserveWhitespace
            };
            using (TextReader reader = new StringReader(document.OuterXml))
            {
                XmlReaderSettings settings = new XmlReaderSettings {
                    XmlResolver = xmlResolver,
                    DtdProcessing = DtdProcessing.Parse
                };
                XmlReader reader2 = XmlReader.Create(reader, settings, baseUri);
                document2.Load(reader2);
            }
            return document2;
        }

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