Какая разница, часть Пятая: подписи сертификатами и строгие имена
И строгое именование и цифровые подписи используют криптографию публичных ключей для обеспечения свидетельств о происхождении сборки, так что вы можете применять политики безопасности для определения того, какие разрешения выдаются сборке.
Наиболее важные их различия лежат не в математических подробностях, а в том, какие проблемы они призваны решить.
Единственная цель строгого имени – в гарантии того, что когда вы загружаете сборку по имени, вы загружаете именно ту сборку, которую думаете, что загружаете. Вы говорите «я хочу загрузить Frobber версии 4, который разработан FooCorp». Механизм строгого имени гарантирует, что вы загружаете именно эту DLL, а не другую сборку по имени Frobber версии 4, которая изготовлена Доктор Зло, Инк. Теперь вы можете установить политику безопасности, гласящую «если у меня на машине есть сборка производства FooCorp, то доверяй ей полностью». Эти сценарии - единственные задачи, для которых проектировались строгие имена.
Всё, что вам нужно для обеспечения этого - знать маркер публичного ключа, ассоциированный с приватным ключом компании FooCorp. Способ, которым вы получите этот маркер публичного ключа, – это ваше личное дело. Нет никакой готовой инфраструктуры, спроектированной для обеспечения безопасного получения вами этой информации. От вас просто ждут, что вы каким-то образом это узнаете. Если злые люди обманом могут заставить вас поверить, что маркер их ключа на самом деле – маркер ключа компании FooCorp, то у вас проблема. От вас ожидают изобретения какого-то разумного способа определить, каков на самом деле маркер ключа FooCorp.
Цель цифровой подписи сертификатом издателя – в установлении верифицируемой цепочки идентификации и доверия. Цепочка доверия ведёт от куска кода неизвестного или непроверенного происхождения к «доверенному корню» - субъекту, доверие к которому вы настроили в своей операционной системе.
Вы скачиваете некоторый код, и у кода есть цифровая подпись сертификатом, принадлежащим FooCorp. Вы смотрите в сертификат, и он говорит «эта программа пришла от FooCorp. Точность этого сертификата удостоверена VeriSign». Поскольку Verisign является одним из ваших доверенных корней, то теперь у вас есть уверенность в том, что этот код действительно пришёл от FooCorp.
Заметьте, насколько сложнее проблема, решаемая цифровыми подписями. Мы не просто пытаемся определить «ассоциирован ли с данным именем этот кусок кода?» Вместо этого мы пытаемся определить, откуда взялся этот код, и кто подтверждает существование якобы ответственной за него компании, и стоит ли нам доверять этой компании.
Разница между строгими именами и цифровыми подписями подчёркивает сложности безопасности, основанной на криптографии. Сложная задача не в криптографии; это всего лишь математика. Сложная задача – безопасное управление распределением информации о ключах и ассоциация их с корректными субъектами. Строгие имена не имеют этих проблем с управлением ключами, поскольку стараются решать очень маленькую, но важную задачу. Или, скорее, они перекладывают задачу управления ключами на вас, на пользователя. Всё, ради чего нужны цифровые подписи – это попытка автоматизировать безопасное распределение информации о ключах при помощи сертификатов, для решения значительно более сложных задач доверия и идентификации.