Цифрові підписи
Кожне оновлення програмного забезпечення, яке ви встановлюєте, кожен підписаний PDF-файл, кожен токен JWT, кожна фіксація коду, надіслана до основного репозиторію Git, кожен сертифікат TLS, який дозволяє вашому веб-переглядачу довіряти веб-сайту, — усе перевіряється цифровими підписами. Криптографічний примітив є одним із найкорисніших інструментів, які є в сучасних обчисленнях, і він відповідає на конкретне запитання: чи ця точна частина даних надійшла від цієї конкретної сутності без змін?
Повний текст статті подано англійською мовою нижче.
A цифровий підпис — це криптографічна операція, яка доводить, що частина даних була створена власником певного закритого ключа, і що дані не були змінені з тих пір. Це цифровий аналог власноручного підпису на папері, але з набагато сильнішими гарантіями: підпис математично прив’язаний до даних, і підробити його без закритого ключа обчислювально неможливо.
Три властивості
A цифровий підпис надає:
- Справжність — доказ того, що підписувач має відповідний закритий ключ.
- IЦілісність — будь-яка зміна підписаних даних робить підпис недійсним.
- Невідмовність — підписувач не зможе згодом достовірно заперечити, що підписав, оскільки будь-хто, хто має відкритий ключ, може перевірити, і лише власник приватного ключа міг створити підпис.
Як насправді працює підпис
Наївна ідея — «шифрувати дані за допомогою закритого ключа» — вловлює дух, але не деталі. Справжні схеми підпису спочатку хешують дані, а потім виконують операцію підписання над хешем. Хешування має важливе значення: операції підписання повільні та працюють з невеликими вхідними даними, але дані, що підписуються, можуть складати мегабайти або гігабайти. Хеш стискає дані довільного розміру в дайджест фіксованого розміру, який потім підписується.
Потік:
- Compute
h = SHA-256(дані)(або інший захищений хеш). - Підпишіть хеш закритим ключем:
sig = sign(h, priv). - Distribute (data, sig).
To verify:
- Compute
h' = SHA-256(data). - Verify
verify(h', sig, pub) == true.
IЯкщо щось змінилося в даних, h' відрізнятиметься від h, і перевірка не вдасться. Якщо підпис створено кимось, крім власника відповідного закритого ключа, перевірка не вдасться.
Загальні алгоритми підпису
- RSA з доповненням PSS або PKCS#1 v1.5 — старіший, але все ще широко розгорнутий. PSS — це сучасна рекомендація.
- ECDSA на кривих NIST (P-256, P-384) — поширений у TLS і підписуванні коду.
- Ed25519 — сучасна схема підпису, розроблена для безпеки та швидкості. Тепер за замовчуванням у OpenSSH, Signal, багатьох розгортаннях TLS.
- SLH-DSA, ML-DSA — схеми постквантових підписів; стандартизовано NIST у 2024 році (SLH-DSA базується на хеші / SPHINCS+, ML-DSA базується на решітці / CRYSTALS-Dilithium).
Де ви зустрічаєте цифрові підписи
- TLS сертифікати. Кожен сертифікат підписаний приватний ключ центру сертифікації, який гарантує зв’язок між доменом і відкритим ключем.
- Оновлення програмного забезпечення. Операційні системи та менеджери пакетів перевіряють підписи на завантажених пакетах перед встановленням. macOS, Windows, Debian, Arch — усі відхиляють непідписані пакунки з офіційних каналів.
- Code signing. Authenticode (Windows), Apple Developer ID, Android APK signing — підписи прив’язують виконувані файли до їхніх розробників.
- Git commit signing. Підписи на комітах і тегах на основі PGP або SSH; GitHub відображає «Підтверджено».
- JWT і маркери OAuth. Затвердження ідентифікації, підписані органом, що випустив.
- Криптовалютні транзакції. Кожна транзакція Bitcoin або Ethereum підписується приватною особою власника ключ.
- Підписані PDF-файли та електронні листи. Повідомлення, підписані S/MIME, PAdES і PGP.
Керування ключами — складна частина
Криптографія врегульована. Операційна проблема полягає в захисті та ротації закритих ключів без переривання обслуговування. Витік ключа підпису коду є катастрофічним — зловмисники можуть підписати довільне шкідливе програмне забезпечення, якому довірятиме ОС. Сучасні найкращі методи:
- Генеруйте приватні ключі в апаратних модулях безпеки (HSM) — ключ ніколи не існує за межами виділеного чіпа.
- Відокремте ключі підпису від ключів довгострокової ідентифікації (офлайн-корінь, онлайн-проміжне підписання).
- Обертайте ключі підпису на регулярний графік; публікувати відкликання у разі зламу.
- Перевіряти кожну операцію підписання.
Правильна перевірка підписів
Три підводні камені, які спричинили справжні CVE:
- Перевірка неправильного ключа. Підпис заслуговує довіри настільки, наскільки ваша причина вірити, що відкритий ключ правильний. Позасмугова перевірка, журнали прозорості ключів або довіра при першому використанні — це практичні відповіді.
- Довіра до поля алгоритму. Деякі формати маркерів (ранні JWT) дозволяють підписувачу вказати алгоритм. Зловмисники скористалися цим, заявивши про «alg=none» і повністю обійшовши перевірку підпису. Верифікатор повинен закріпити очікуваний алгоритм.
- Не вдалося перевірити, чи підпис охоплює правильні дані. Підпис на хеші документа нічого не доводить, якщо ви можете поміняти, який документ представлено на який підпис.
Зроблено правильно, цифрові підписи є основою довіри до сучасного Інтернет.
Часті запитання
- Чим цифровий підпис відрізняється від шифрування?
- Шифрування зберігає конфіденційність даних. Підписання підтверджує походження та цілісність даних, але не приховує цього. Багато протоколів поєднують обидва: шифрування, щоб зберегти конфіденційність вмісту, підпис, щоб підтвердити автентичність. Вони використовують різні ключі, часто різні алгоритми.
- Чи можна підробити цифровий підпис?
- Не без закритого ключа. Криптографічна міцність така ж, як і базовий примітив (Ed25519 практично неможливо підробити). Реалістичні шляхи підробки: викрадення закритого ключа, використання слабких генераторів випадкових чисел під час підписання (класичний режим помилки ECDSA) або підписання неправильної речі через помилку перевірки.
- Чому ми хешуємо перед підписанням, а не підписуємо дані безпосередньо?
- Дві причини: підписування відбувається повільно на великих вхідних даних, а алгоритми підпису мають обмеження на розмір повідомлення. Хеш стискає довільні дані до значення фіксованого розміру, яке алгоритм може ефективно підписати. Властивість безпеки зберігається, оскільки хеш-функція стійка до зіткнень.
- Яка різниця між цифровим підписом і електронним підписом?
- Електронний підпис — це юридичний термін — будь-який знак, що вказує на згоду чи авторство, включно з введенням вашого імені. Цифровий підпис — це криптографічний термін — конкретна математична операція. Багато електронних підписів не мають криптографії; багато цифрових підписів не визнаються в суді без додаткової церемонії. Ці два терміни збігаються, але не є синонімами.
- Чи підтверджує цифровий підпис дату підписання документа?
- Не сама по собі. Вам потрібна окрема <em>trusted timestamp</em> від Уповноваженого органу з відміток часу або нотаріальне засвідчення через загальнодоступну службу відміток часу (OpenTimestamps записує в блокчейн біткойнів). Лише підписання доводить, що «цей підпис було створено раніше, а не в якийсь конкретний час».