Как CLR проверяет, что мое приложение использует правильную сборку - PullRequest
4 голосов
/ 29 июня 2011

Я знаю, что это делается путем подписания сборки закрытым ключом.

Так вот как я вижу процесс ... Когда у нас есть файл пары секретный / открытый ключ, мы можем построить сборку, подписав его, используя эти ключи. Итак, что действительно сделано, так это то, что компилятор открывает файл 'sk' (или pfx) и получает закрытый ключ (который, как я понимаю, невозможен для человека), и после подписания сборки с помощью закрытого ключа добавляет открытый ключ в манифест сборки и это все, у меня есть строго названная сборка.

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

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

Цитата из CLR через C #

Подписание сборки закрытым ключом гарантирует, что держатель соответствующий открытый ключ произвел сборка. Когда сборка установлен в GAC, система хэширует содержимое файла содержит манифест и сравнивает значение хэша с цифровым RSA значение подписи, встроенное в PE файл (после подписания его с открытый ключ). Если значения идентичны, содержимое файла не был подделан, и вы знаете, что у вас есть открытый ключ, который соответствует частному издателю ключ. Кроме того, система хеширует содержание другого собрания файлы и сравнивает значения хеш с хэш-значениями, хранящимися в Таблица FileDef файла манифеста. Если есть значения хеша не совпадают, в по крайней мере один из файлов сборки имеет был подделан, и сборка не удастся установить в GAC.

Ну, вот как это работает.

Когда вы компилируете сборку, отмечая, что вы хотите подписать ее с уже сгенерированным файлом пары открытый / закрытый ключ, компилятор вычисляет хеш сборки (также вычисляет хеш для каждого файла в сборке и сохраняет значения вместе с именами файлов в таблице FileDef), тогда он подписывает значение хеша закрытым ключом и встраивает открытый ключ в манифест для этой сборки.

Теперь во время выполнения, когда приложение (сборка) пытается загрузить эту подписанную сборку, сборка снова хэшируется, затем CLR получает открытый ключ из манифеста сборки и дешифрует знак RSA и сравнивает значение хеш-функции со значением знака. Если они одинаковые, то ничего не изменилось.

0 голосов
/ 29 июня 2011

Строгое имя содержит отпечаток открытого ключа. Таким образом, CLR может проверить, совпадает ли ключ puplic с именем, и подписана ли сборка соответствующим закрытым ключом.

Хорошая статья о сильных именах: http://ondotnet.com/pub/a/dotnet/2003/04/28/strongnaming.html

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...