Кажется, я не могу понять эту вещь для подписи сборки .NET

Хорошо, я, должно быть, тупой, потому что я уже читал это: http://www.csharp411.com/net-assembly-faq-part-3-strong-names-and-signing/

И я до сих пор не понимаю ...

Допустим, я открываю свойства своего проекта и перехожу на вкладку «Подписание», затем устанавливаю флажок «Подписать сборку» и генерирую новую сборку с паролем. Был создан ключевой файл строгого имени с расширением .pfx, включающий как открытый, так и закрытый ключи, и VS будет подписывать мою сборку цифровой подписью при компиляции, верно?

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

Кто-нибудь может мне это объяснить? По сути, я хочу подписать сборку моего проекта и позволить пользователям проверять, действительно ли сборка была разработана мной, где я единственный, кто хранит закрытый ключ (что, как мне кажется, я должен).


person rfgamaral    schedule 31.07.2009    source источник


Ответы (4)


Вы в основном правы.

Вы создаете пару ключей и используете ее для подписи. Но не отправляйте файл pfx (или snk), он содержит как открытый, так и закрытый ключи и должен храниться в безопасности.

Открытый ключ добавляется в сборку как часть процесса подписания.

Эта подпись проверяется при загрузке сборки в приложение. Конечные пользователи также могут проверить токен открытого ключа в GAC, но это не совсем удобный процесс. И вы должны каким-то образом сообщить им свой токен открытого ключа.

И все это настолько надежно, насколько вы можете сохранить конфиденциальность ключевого файла.

Также обратите внимание, что в идеале у вас должен быть только 1 ключ на компанию. Если вы беспокоитесь о том, чтобы поделиться им с (многими) коллегами, рассмотрите вопрос о задержке подписания.

person Henk Holterman    schedule 31.07.2009

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

person msvcyc    schedule 31.07.2009

Подписание сборки основано на криптогруппе с открытым ключом (PKI). Вкратце общая концепция заключается в том, что когда вы криптографически подписываете что-либо с помощью PKI, закрытый ключ используется для подписи, а открытый ключ используется для проверки подписи. Приватный ключ нельзя использовать для проверки подписи, только создайте его. Открытый ключ нельзя использовать для создания подписи, только проверьте его.

Учитывая это, очень важно, чтобы ваш закрытый ключ был безопасным и конфиденциальным. Если вы хотите поддерживать высочайший уровень безопасности и обеспечивать высочайший уровень аутентичности для своих клиентов, вероятно, было бы лучше использовать отложенное подписание, и чтобы один человек или отдел отвечал за управление вашими полными парами открытого / закрытого ключей. . Разработчики не должны иметь доступа к закрытому ключу и могут использовать опцию отложенной подписи, чтобы по-прежнему разрабатывать сборки со строгими именами без ущерба для безопасности и аутентичности.

person jrista    schedule 31.07.2009
comment
На самом деле использование публичных / приватных ключей довольно симметрично. Обычное кодирование (без подписи) использует открытый ключ. - person Henk Holterman; 01.08.2009
comment
@Henk: Если вы говорите о шифровании, да, открытый ключ используется для шифрования, а закрытый ключ используется для дешифрования. В рамках подписания все наоборот. И я не уверен, почему вы назвали это симметричным ... вся концепция использования одного ключа для шифрования / подписи и другого ключа для дешифрования / проверки довольно асимметрична. - person jrista; 01.08.2009
comment
Подпись - это, по сути, шифрование в обратном направлении, это симметричная часть. Но вы правы, это называется асимметричной криптографией. - person Henk Holterman; 01.08.2009

Подпись = Шифрование SHA1-хэша сборки с использованием закрытого ключа
Проверка = Сравнение расшифрованной с помощью PublicKey подписи с вычисленным хешем сборки

Таким образом, любой, у кого есть PublicKey, может проверить сборку, но только автор с PrivateKey может подписать сборку.

Токен PublicKey = последние 64 бита хэша SHA1 PublicKey в обратном порядке байтов.

person Software Wizzard    schedule 08.07.2011