Можно ли подписать XML-документ без использования KeyContainerName?

Я хочу создать 2 действительно простых библиотеки:

1) который подпишет документ XML 2) который проверит, что документ XML не был изменен.

Я попытался использовать RSACryptoServiceProvider и контейнер ключей. Но когда я перехожу на другую машину, это не работает, так как ключ хранится в машине.

Я хочу сохранить ключ в dll, который я создаю (я знаю, что это не рекомендуется), но я просто не могу понять, как написать некоторый код, чтобы просто подписать XML-документ, а затем убедиться, что он не был изменен.

Так что мне нужно использовать симметричный ключ, чтобы сделать то, что я хочу, возможно ли это?

Пит

2 ответа

Решение

Вы уже упоминали о проблемах с хранением закрытого ключа в dll, поэтому я не буду повторять это.

Сделай это:

На своей машине запустите этот код:

var key = new RSACryptoServiceProvider(2048);
string publicKey = key.ToXmlString(false);
string privateKey = key.ToXmlString(true);
Console.WriteLine(publicKey);
Console.WriteLine(privateKey);

это выводит две (длинные) строки. Скопируйте их в свой код:

Знак:

var privateKey = new RSACryptoServiceProvider();
privateKey.FromXmlString(/* insert the private-key XML string here */ );
privateKey.SignData(/*...*/);

Убедитесь, что:

var publicKey = new RSACryptoServiceProvider();
publicKey.FromXmlString(/* insert the public-key XML string here */ );
publicKey.VerifyData(/*...*/);

Если вы собираетесь проверить, что ваш XML-документ не был изменен, простую контрольную сумму MD5 (или любой другой хороший алгоритм хеширования) будет проще реализовать, и это то, что вам нужно. Это также можно проверить на разных машинах.

Другие вопросы по тегам