2015-05-26 2 views
1

Я унаследовал приложение C# .NET, которое нуждалось в незначительных изменениях в некоторых строках имени пути в одной из сборников DLL. К сожалению, у меня нет исходного кода.Подписание сборки DLL с открытым ключом

Я внесла необходимые изменения, используя ILSpy и плагин Reflexil. Когда я сохраняю DLL, мне говорят, что оригинальный файл подписан и что новый файл не будет работать без его подписания. Новый файл теперь «задержка подписана».

Я вижу открытый ключ, токен открытого ключа и хэш-алгоритм с Reflexil.

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

У меня есть Visual Studio 2013, поэтому у вас есть доступ к sn.exe, если это помогает.

+6

Если бы вы могли это сделать, весь процесс подписания был бы абсолютно бесполезным. Единственный способ - полностью удалить подпись (которая может распространяться через несколько сборок). Вам понадобится секретный ключ для правильной подписи сборки. – Luaan

+0

@ Luaan Я могу создать закрытый ключ с моей машины. Будет ли это помогать, или это должен быть оригинальный секретный ключ? –

+1

Это зависит от того, что вы пытаетесь сделать. Возможно, было бы прекрасно оставить собрание без подписи. Возможно, было бы хорошо создать свой собственный ключ и подписать с этим. Но в обоих случаях у вас будет другая сборка - любые сборки, которые ссылаются на нее, должны быть перекомпилированы (ну, их ссылки должны будут измениться). Подпись является частью идентичности сборки - вы не хотите, чтобы кто-то дал вам свой собственный mscorlib, который молча заменил бы ваши собственные ссылки на mscorlib, не так ли? – Luaan

ответ

2

Как сказал Luaan выше, то, что я хотел сделать, невозможно. Частный ключ - это просто - частный. Открытый ключ предназначен для проверки, чтобы убедиться, что сборка не была изменена.

Удаление сильного имени было вариантом, как сказал Luaan в одном из своих комментариев. Однако это не сработало для меня, так как было много зависимостей, что делало метод непрактичным.

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

Чтобы отключить сильную проверку имен, добавить этот ключ в реестр:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\<filename without extension>,<public key token> 

Для 64-битных систем, вам нужно добавить этот ключ, а также:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\StrongName\Verification\<filename without extension>,<public key token> 

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

Смежные вопросы