Яка роль маркера відкритого ключа? Чи бере він участь у дешифруванні підписаного хешу. Чому в GAC так багато збірок від Microsoft з однаковим маркером відкритого ключа ?.
Яка роль маркера відкритого ключа? Чи бере він участь у дешифруванні підписаного хешу. Чому в GAC так багато збірок від Microsoft з однаковим маркером відкритого ключа ?.
Відповіді:
Яка роль маркера відкритого ключа?
Маркер відкритого ключа - це невелика кількість, що є зручним "маркером", що представляє відкритий ключ. Відкриті ключі досить довгі; мета маркера відкритого ключа - дозволити вам посилатися на ключі, не вимовляючи цілий ключ. Начебто так само кажуть "Володар кілець" - це п'ять слів, які представляють роман із півмільйона слів. Було б досить незручно, якби кожного разу, коли ви хотіли про це поговорити, вам доводилося вимовляти ці півмільйона слів.
Чи бере він участь у дешифруванні підписаного хешу?
Ні. Маркер відкритого ключа не містить "інформації". Це просто цифра, яка представляє відкритий ключ. Сам по собі він не є відкритим ключем.
чому так багато збірок від Microsoft з однаковим маркером відкритого ключа?
Оскільки всі вони були підписані одним і тим же закритим ключем - приватним ключем Microsoft - і тому всі вони перевіряються одним і тим же відкритим ключем, і тому всі мають однаковий маркер відкритого ключа.
Assembly.FullNameвластивість, щоб отримати його за допомогою інструментів командного рядка див. Цю відповідь
"Маркер відкритого ключа використовується для того, щоб зробити ім'я збірки унікальним. Таким чином, дві сильні іменовані збірки можуть мати одне і те ж ім'я файлу PE, і тим не менше. Ім'я файлу PE, тому дві збірки з однаковим іменем файлу PE (але з різною культурою, версією або маркером відкритого ключа) не можуть існувати в одній папці Windows. Для вирішення цієї проблеми .NET вводить щось під назвою GAC (Global Assembly Cache), що є обробляється .NET CLR як одна папка, але насправді реалізується за допомогою вкладених папок NTFS (або FAT32).
Для запобігання підробляючим атакам, коли зломщик намагається видати збірку, що виглядає як щось інше, збірка підписується приватним ключем. Розробник запланованої збірки зберігає секретний ключ у секреті, тому зловмисник не може мати до нього доступу, ані просто вгадати. Таким чином, зломщик не може змусити видавати себе за щось інше, не маючи можливості правильно підписати його після зміни. Підписання збірки передбачає взяття хешу важливих частин збірки, а потім шифрування хешу за допомогою закритого ключа. Підписаний хеш зберігається у збірці разом із відкритим ключем. Відкритий ключ розшифрує підписаний хеш.Коли CLR завантажує сильно названу збірку, вона генерує хеш зі збірки, а потім порівнює це з розшифрованим хешем. Якщо порівняння вдалося, це означає, що відкритий ключ у файлі (а отже, і маркер відкритого ключа) пов'язаний із закритим ключем, який використовується для підписання збірки. Це означатиме, що відкритий ключ у збірці є відкритим ключем видавця збірки, а отже, атака підміни зірвана. "
Хеш - це свого роду "відбиток пальця". Він підписується за допомогою приватного ключа, що належить (і відомий лише) підписувачеві. Якщо ви знаєте відкритий ключ підписувача, ви можете перевірити, чи справді хеш надходить від підписувача, а отже, чи справді дані / файл походять від підписувача (і залишаються незмінними). Однакові відкриті ключі для деяких файлів у GAC означають "усі підписані тим самим підписувачем".
Маркер відкритого ключа - це дещо читабельний уривок справжнього відкритого ключа. Повний відкритий ключ зберігається в підписаній збірці і використовується для дешифрування підпису (= зашифрований хеш). Завантажувач використовує це для перевірки вмісту, не порушеного (або пошкодженого). Оригінальний хеш був зашифрований автором за допомогою закритого ключа, і лише хтось володіє цим ключем може надати дійсний підпис.
Кожна компанія (або відділ) повинна використовувати лише 1 пару ключів, тому в GAC ви бачите групи однакових ПКТ.
Я хотів би додати до попередніх відповідей (особливо до тієї, що містить цитату з Вікіпедії), що сильне присвоєння імен за допомогою відкритого / приватного ключа не захищає вас від отримання зміненої збірки або заважає комусь втручатися у ваші збірки.
Перш за все , сильна назва не гарантує, що складання можна довіряти. У вас просто є відкритий ключ / маркер відкритого ключа, але ви не знаєте особу, яка його підписала (крім випадків, коли вони якимось чином оголосять, що їм належить відкритий ключ асамблей).
Наприклад, хакер може взяти вашу збірку, видалити з неї надійне ім'я (є інструменти, які це роблять) і підписати його своїм власним надійним ім'ям. Для тресту існує інший вид підписання цифрового коду сертифікатом. Він передбачає перевірку третьою стороною вас і вашої компанії і не є безкоштовним. Перевірте технологію Authenticode:
https://msdn.microsoft.com/en-us/library/ms537359(v=vs.85).aspx
По-друге , у наступному обговоренні коротко описано метод атаки грубої сили для отримання пари відкритого / приватного ключів з тим самим маркером відкритого ключа, який створив би той самий хеш для фальсифікованого складання:
https://groups.google.com/forum/?hl=uk#!topic/microsoft.public.dotnet.security/Jo6PqypxJN8
Я повинен зазначити, що це могло бути вирішено за допомогою посиленого сильного іменування https://docs.microsoft.com/en-us/dotnet/framework/app-domains/enhanced-strong-naming
Також під час обговорення була згадана помилка, яка дозволила пропустити перевірку збірки та завантажити підроблену збірку під час виконання. Детальне дослідження тут, помилка виправлена в пізніших версіях .Net framework (тому помилка присутня для старого .Net 1):
http://www.grimes.nildram.co.uk/workshops/fusionWSCrackThree.htm
По-третє , запуск .Net 3.5 sp1 для збільшення продуктивності навантаження збірок не перевіряється за замовчуванням для повноцінних збірок.
Умова збірки: https://blogs.msdn.microsoft.com/shawnfa/2008/05/14/strong-name-bypass/
Дискусія про це на Stack Overflow: Чи підписані .net-збірки коли-небудь повністю перевіряються при завантаженні, щоб перевірити, що вони не були змінені?
Як я розумію, це означає, що збірка не хешується під час навантаження, щоб перевірити її
Нарешті , я хотів би відзначити, що ведуться суперечки щодо плюсів і мінусів сильних імен, оскільки для них потрібно вказати версію збірки. Корпорація Майкрософт видаляє сильну назву з деяких їх продуктів: https://www.pedrolamas.com/2016/03/01/still-strong-naming-your-assemblies-you-do-know-its-2016-right/
На закінчення, Я хотів узагальнити всі згадані пункти. Коли я зіткнувся з сильним іменованням, то MSDN та Вікіпедія мене ошукали, що це могло забезпечити якийсь захист для зборів. Я подумав, що "Круто" і сильне іменування залишилося в моїй пам'яті як механізм захисту. До того моменту, коли мені довелося думати про безпеку мого файлу snk із закритим ключем, а потім мій колега сказав мені, що це не так "Класно". Тож я зробив невелике дослідження. Перше, про що я дізнався, це те, що сильне ім’я не означає довіру, для цього слід використовувати сертифікат. Тим не менш, я думав, що якщо я зберігатиму свій приватний ключ у безпеці, тоді фальсифікована збірка не буде підписана мною, тобто, якщо хтось буде модифікувати мою збірку, то йому доведеться також змінити знак, і змінена збірка не буде завантажена CLR. Зараз я не Я не думаю, що сильне найменування це гарантує. Тож слід покладатися на нього лише для того, щоб гарантувати унікальність збірки.
PS. Вибачте за довгий пост з великою кількістю посилань.