Является ли использование цифровой подписи для подписи сборки со строгим именем плохой практикой?

Мне любопытно, благодаря исследованиям Google я узнал о цифровых подписях и сборках со строгими именами. Кажется возможным использовать цифровую подпись для подписи сборки со строгим именем, если вы очень постараетесь.

Я предполагаю, что с помощью этой практики можно обойти цель цифровой подписи, используя ее таким образом.

Microsoft говорит:

«сильные имена сами по себе не подразумевают такого уровня доверия, как тот, который обеспечивается, например, цифровой подписью и поддерживающим сертификатом».
- http://msdn.microsoft.com/en-us/library/wd40t7ad%28v=vs.110%29.aspx

Правильно ли я предполагаю, что использование цифровой подписи таким образом на самом деле является плохой практикой, которая может создать брешь в безопасности и определенно бесполезна? Или это вообще возможно? Возможно ли использование цифровой подписи в качестве строгого имени или лучше, чем ничего не делать? Обеспечивает ли он дополнительную безопасность помимо правильного использования цифровой подписи.


person amalgamate    schedule 06.03.2014    source источник
comment
Сборки Microsoft .NET Framework имеют строгие имена и имеют цифровую подпись Microsoft.   -  person Michael Liu    schedule 07.03.2014
comment
@MichaelLiu Умм Что ты хочешь сказать? Детали?   -  person amalgamate    schedule 07.03.2014
comment
Если Microsoft сделает это, то, конечно, не может быть этой плохой практикой использовать цифровую подпись для сборки со строгим именем.   -  person Michael Liu    schedule 07.03.2014
comment
@MichaelLiu. Для меня это звучит как ясный и хороший ответ. Кроме того, чтобы внести ясность: вы говорите, что строгие имена, которые Microsoft использует для своей подписи Strong Named Assembly те же подписи, что и их цифровые подписи? У каждого может быть отдельная подпись, верно?   -  person amalgamate    schedule 07.03.2014
comment
возможный дубликат подписания сборок .NET   -  person Alexei Levenkov    schedule 07.03.2014
comment
@AlexeiLevenkov Я думаю, вам не хватает тонкости. Я хочу узнать о воображаемой (будь то мое собственное воображение) дыре в безопасности из связи этих двух концепций. Не для того, чтобы точно знать, как это работает в целом, а для того, чтобы понять одну конкретную деталь одного и того же предмета. Я действительно прочитал этот пост в своем исследовании.   -  person amalgamate    schedule 07.03.2014
comment
@amalgamate: строгие имена и цифровые подписи разделены и используют разные ключи.   -  person Michael Liu    schedule 07.03.2014
comment
@MichaelLiu еще один отличный момент, но означает ли это, что их невозможно смешивать и сочетать? Это было бы правильным ответом на мой вопрос, особенно если бы он был в форме ответа.   -  person amalgamate    schedule 07.03.2014
comment
Вы должны прочитать мою статью на эту тему. blogs.msdn.com/b/ericlippert/archive/2009/09/03/   -  person Eric Lippert    schedule 07.03.2014
comment
@EricLippert Спасибо, я сделал это перед своим постом, но это прекрасная статья, и она ясна. Чтобы быть уверенным, я полагаю, что строгое именование в основном предназначено для использования GAC для предотвращения ада DLL, и я полагаю, что мой секретный момент или вопрос в форме ответа заключается в том, что использование строгого именования для чего-то еще ( security) не так продуктивно, когда у нас есть другой инструмент, который, по крайней мере, немного лучше.   -  person amalgamate    schedule 07.03.2014
comment
Обратите внимание: я удалил расплывчатые ссылки, которые у меня были на другие сообщения, поскольку я думаю, что они не помогают в вопросе и, похоже, также отвлекают.   -  person amalgamate    schedule 07.03.2014
comment
Нет. Сильное именование не предотвращает ада DLL. version в имени предотвращает ад для DLL, но не это делает имя сильным. Что делает имя сильным, так это токен открытого ключа, и это используется в целях безопасности: чтобы предоставить свидетельство, которое является входом для < i> политика безопасности.   -  person Eric Lippert    schedule 07.03.2014
comment
@EricLippert Понятно, - говорит слепой. Кроме того, если вы явно связываете с помощью GAC, я думаю, вы используете больше, чем просто версию, потому что я думал, что читал, что вы можете использовать это для разграничения между двумя библиотеками с одинаковым именем. Я ошибся?   -  person amalgamate    schedule 07.03.2014
comment
Сборка в GAC должна иметь строгое имя; вам не следует помещать код в GAC, если у вас нет свидетельств того, откуда он взялся. Опять же: часть имени DLL Hell решающая - это версия. Решающая проблема «я хочу запустить код, фактически написанный Microsoft» - это токен ключа.   -  person Eric Lippert    schedule 07.03.2014
comment
@EricLippert Итак, главный ключ к моему недоразумению заключается в том, что сильное именование является функцией безопасности, а не чем-то исключительно предназначенным для GAC, как я, возможно, неправильно понял. Еще больше меня смущало то, что цифровая подпись - это похожая, но другая функция. (Не нужно вдаваться в подробности, поскольку их различия ясны в вашей статье.)   -  person amalgamate    schedule 07.03.2014
comment
Очень жаль, что существуют две очень похожие вещи, потому что это приводит к запутанным разговорам, подобным этому! :-) Если бы я стал королем .NET и получил бы возможность делать это снова и снова, я бы сделал строгое именование и подписание сертификатом одним и тем же, и заставил бы инструмент генерации ключей строгого имени создавать самозаверяющий сертификат.   -  person Eric Lippert    schedule 07.03.2014


Ответы (3)


Просто разбейте это на чистые части, потому что я не совсем уверен, о чем вы спрашиваете.

Можно ли использовать закрытый ключ цифровой подписи (например, Authenticode) для строгого присвоения имени сборке?

Да, по крайней мере теоретически, поскольку все ключи представляют собой последовательность байтов.

Есть ли в этом смысл?

Поскольку вам не нужно платить за закрытый ключ для строгого именования, использование платной цифровой подписи для этого не имеет особого смысла, нет. Вы платите за доверие, связанное с цифровой подписью. Сильное именование, как объяснили Эрик Липперт, Алексей и другие, не означает доверия.

Будет ли это брешь в безопасности, если вы все равно это сделаете?

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

ETA: Я бы хотел увидеть сообщения, упомянутые в вопросе, о строгом именовании с использованием подписи Authenticode (в отличие от их объединения).

person JimmiTh    schedule 06.03.2014
comment
+1: Я думаю, что выдача при сборке открытого ключа - это ответ на основной интерес этого вопроса. - person Alexei Levenkov; 07.03.2014
comment
Думаю, вы очень хорошо поняли, о чем я спрашивал. - person amalgamate; 07.03.2014
comment
Я рад. :-) См. Отредактированный ответ (внизу) - если бы вы могли дать ссылку на любой из этих постов, я бы хотел видеть их из интереса. - person JimmiTh; 07.03.2014
comment
это один из многих постов, у которых, казалось, была идея в их голове, но я знаю, что это была часть вопроса, где op также не был ясен по существу. Большинство из них были такими. stackoverflow.com/questions/8300865/, мне кажется, я помню некоторые сообщения о приложениях для мобильных телефонов, которые казались более смутными в самих себе, однако я не смог их найти, когда бегло просмотрел историю своего браузера. Дело в том, что я нашел способ запутаться в собственном понимании после того, как увидел, что другие сбиты с толку. - person amalgamate; 07.03.2014
comment
Да, я думаю, что главное здесь не в том, чтобы использовать Authenticode для строгого именования, а в том, что клиент хочет SN - а OP уже Authenticode подписывает свой код и задается вопросом, служит ли это само по себе цели. сильного именования - чего нет. Как сказал @AlexeiLevenkov, эти две концепции служат разным целям. - person JimmiTh; 07.03.2014

Является ли использование цифровой подписи для подписи сборки со строгим именем плохой практикой?

Нет. Это совершенно хорошая практика.

Кажется возможным использовать цифровую подпись для подписи сборки со строгим именем, если вы очень постараетесь.

Это немного сложно, потому что и сильное именование, и цифровая подпись изменяют сборку. Сборка должна быть сначала со строгим именем, а затем подписана.

Я предполагаю, что с помощью этой практики можно обойти цель цифровой подписи, используя ее таким образом, поскольку сборка со строгим именем может быть взломана

Хорошо, значит, вы предполагаете, что есть атака. Я предполагаю, что нет. Укажите уязвимость и предлагаемую атаку.

(по крайней мере, в каком-то посте так сказано).

Вы собираетесь заставить нас угадать, в каком посте это сказано?

«сильные имена сами по себе не предполагают такого уровня доверия, как тот, который обеспечивается, например, цифровой подписью и подтверждающим сертификатом».

Это правильно. Строгие имена и цифровые сертификаты похожи, но решают разные проблемы. Строгие имена решают проблему идентификации сборок. Подписи решают проблему цепочки доверия.

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

Ни строгое именование, ни подпись сертификатов вообще не защищают программное обеспечение! Цель системы безопасности не в защите программного обеспечения, а в защите пользователей. У нас нет водительских прав, чтобы уберечь Департамент транспортных средств от нападений ниндзя. У нас есть водительские права, подтверждающие, что их предъявитель действительно является тем, кем они являются, и имеет право водить машину. Любой, кто думает, что сильное именование используется для защиты программного обеспечения, очень и очень сбит с толку.

Правильно ли я предполагаю, что использование цифровой подписи таким образом на самом деле является плохой практикой, которая может создать брешь в безопасности и определенно бесполезна?

Нет, вы ошибаетесь по всем пунктам.

хорошо это или плохо - переходить ручейки (извините за юмор.)?

Почему это должно быть плохо? Все, что у нас есть, - это ваше заявление о нападении и никаких доказательств того, что оно действительно есть.

Или это вообще возможно?

Конечно, это возможно.

Я видел сообщения со ссылками на их совместное использование (использование цифровой подписи для подписи сборки с конкретным именем (без цифровой подписи)) возможно или лучше, чем ничего не делать?

Вы просите нас прокомментировать достоверность сообщений, которые мы не читали и на которые вы не указали ссылки. Как нам узнать, точны они или нет?

person Eric Lippert    schedule 06.03.2014
comment
Не нужно искать другие сообщения, я уверен, что некоторые из них были неточными, а некоторые нет. Я использую их как мотивацию для своего вопроса, они не важны для сути вопроса. Я рассмотрю возможность удаления этой части. Суть вопроса проста (по крайней мере, в моем понимании), но я посмотрю, смогу ли я сделать его лучше, чтобы он соответствовал принятому ответу. - person amalgamate; 07.03.2014
comment
В своем продукте мы начали с сильных имен и цифровой подписи для каждой сборки. Мы сталкиваемся с проблемами на машинах, которые не подключены к Интернету или корпоративным сетям. В сфере здравоохранения это нормально. Перед запуском процесса создания EXE-файла с цифровой подписью существует большая задержка. Это вызвано устаревшим списком отзыва сертификатов, который система пытается обновить. Но нет доступа к Интернету или DNS-сервера, поэтому таймаут DNS +/- 30 секунд. должно произойти до запуска процесса. Это ситуация, когда цифровая подпись порождает проблему и дополнительную работу. - person embee; 18.03.2014

Для ключей, используемых для строгой подписи сборок, не существует цепочки доверия. Вы не можете использовать ключи одного и того же типа для подписи строгого имени и «подписи кода»: поэтому нет проблем с «смешиванием и сопоставлением». Эти два типа сервера подписи имеют разные цели, и вам нужно выбрать те, которые вам нужны в вашем конкретном случае (скорее всего, просто подписание строгого имени и .Net не имеет встроенной проверки для другого).

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

Строгая подпись говорит вам, что сборки, подписанные одним и тем же ключом, созданы одной и той же «сущностью», но нет указания на то, что / кто эта «сущность». Вы не можете сказать «эта новая версия сборки построена компанией FooBar», вы можете только сказать «она построена той же компанией / группой, что и предыдущая».

Примечание. Действительно, существуют некоторые «хорошо известные» открытые ключи (например, сборки Framework, подписанные Microsoft), но вы не можете получить какую-либо сборку и сказать «подписано X», просто взглянув на открытый ключ.

Обратите внимание, что это подробно описано в ответе Эрика Липперта - Подписание сборок .NET.

person Alexei Levenkov    schedule 06.03.2014
comment
Хорошо, пока все хорошо, что подтверждает многое из того, что я прочитал. Но разве это хуже, чем ничего не делать? рискуете ли вы своим сертификатом, неправильно используя его для строго именования сборки? (хотя, как я понимаю, вы говорите, что это сложно и непозволительно.) - person amalgamate; 07.03.2014
comment
Найден правильный дублированный ответ Эйка Липперта - stackoverflow.com/questions/1334631/ подписание сетевых сборок. Я считаю, что вы не можете предоставить вам индивидуальный сертификат для строгой подписи, поэтому вы не можете ничем рисковать. - person Alexei Levenkov; 07.03.2014
comment
Я думаю, что ваш комментарий, например @Michael Liu, отвечает на вопрос ... по крайней мере, почти, за исключением того, что это комментарии. - person amalgamate; 07.03.2014
comment
@amalgamate - Я вставил комментарий, также я думаю, что ответ Эрика также охватывает вас и вашу главную мысль - два типа пения просто разные и не связаны между собой. - person Alexei Levenkov; 07.03.2014
comment
Кстати, +1, вы прошли долгий путь, чтобы помочь мне понять это. - person amalgamate; 07.03.2014