Неправильная канонизация (c14n), сделанная SignedXml - он удаляет разрывы строк ( ) — это ошибка .NET?C#

Место общения программистов C#
Ответить
Anonymous
 Неправильная канонизация (c14n), сделанная SignedXml - он удаляет разрывы строк ( ) — это ошибка .NET?

Сообщение Anonymous »

Мы получаем подписанные XML-файлы от третьих лиц, использующих Java. Наша реализация .NET правильно проверяет подписи, за исключением случаев, когда xml содержит ссылку на символ .

Похоже, что .NET удаляет этот символ разрыва строки где-то в процессе c14n.

Я провел несколько тестов на C# со следующим xml:

Код: Выделить всё

var xml = "something
\nsomething\r\n";
Используя следующий код для c14n:

Код: Выделить всё

    public static void c14n(string xml)
{
using (MemoryStream msIn = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{
var t = new XmlDsigExcC14NTransform(false);
t.LoadInput(msIn);
var o = t.GetOutput() as MemoryStream;
var c14n = Encoding.UTF8.GetString((o as MemoryStream).ToArray());
Console.WriteLine(c14n);
}
}
приведет к следующему XML-файлу, который соответствует спецификациям w3org (каждая строка заканчивается символом LF):

Код: Выделить всё

something
something

Однако при использовании следующего кода можно увидеть, какую каноническую форму имеет XML, подписанный классом SignedXml .NET:

Код: Выделить всё

public static void SignXml(string xml)
{
var doc = new XmlDocument { PreserveWhitespace = true };
doc.LoadXml(xml);

var cspParams = new CspParameters { KeyContainerName = "XML_DSIG_RSA_KEY" };
var rsaKey = new RSACryptoServiceProvider(cspParams);

var signedXml = new SignedXml(doc);
signedXml.SigningKey = rsaKey;
var reference = new Reference { Uri = "" };

var env = new XmlDsigEnvelopedSignatureTransform();
var excC14NTransform = new XmlDsigExcC14NTransform(false);
reference.AddTransform(env);
reference.AddTransform(excC14NTransform);
reference.DigestMethod = "http://www.w3.org/2001/04/xmlenc#sha256";
signedXml.AddReference(reference);
signedXml.ComputeSignature();
var c14n = Encoding.UTF8.GetString((excC14NTransform.GetOutput() as MemoryStream).ToArray());
Console.WriteLine(c14n);
}
приведет к созданию другого XML-файла (каждая строка заканчивается символом LF), и мы видим, что разрыв строки ( ) был удален:

Код: Выделить всё

something
something

Есть ли способ использовать класс SignedXml, чтобы использовать правильную каноническую форму? Может ли синтаксический анализ XML (при создании XmlDocument) быть причиной этой проблемы?

Интересно, является ли это ошибкой в ​​.NET и есть ли обходной путь для нее.

Подробнее здесь: https://stackoverflow.com/questions/476 ... -breaks-13
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»