SIGNEDSHA-256 digest signed with Ed25519

Цифрові підписи

10 хв. читанняКриптографія

Кожне оновлення програмного забезпечення, яке ви встановлюєте, кожен підписаний PDF-файл, кожен токен JWT, кожна фіксація коду, надіслана до основного репозиторію Git, кожен сертифікат TLS, який дозволяє вашому веб-переглядачу довіряти веб-сайту, — усе перевіряється цифровими підписами. Криптографічний примітив є одним із найкорисніших інструментів, які є в сучасних обчисленнях, і він відповідає на конкретне запитання: чи ця точна частина даних надійшла від цієї конкретної сутності без змін?

Повний текст статті подано англійською мовою нижче.

A цифровий підпис — це криптографічна операція, яка доводить, що частина даних була створена власником певного закритого ключа, і що дані не були змінені з тих пір. Це цифровий аналог власноручного підпису на папері, але з набагато сильнішими гарантіями: підпис математично прив’язаний до даних, і підробити його без закритого ключа обчислювально неможливо.

Три властивості

A цифровий підпис надає:

  • Справжність — доказ того, що підписувач має відповідний закритий ключ.
  • IЦілісність — будь-яка зміна підписаних даних робить підпис недійсним.
  • Невідмовність — підписувач не зможе згодом достовірно заперечити, що підписав, оскільки будь-хто, хто має відкритий ключ, може перевірити, і лише власник приватного ключа міг створити підпис.

Як насправді працює підпис

Наївна ідея — «шифрувати дані за допомогою закритого ключа» — вловлює дух, але не деталі. Справжні схеми підпису спочатку хешують дані, а потім виконують операцію підписання над хешем. Хешування має важливе значення: операції підписання повільні та працюють з невеликими вхідними даними, але дані, що підписуються, можуть складати мегабайти або гігабайти. Хеш стискає дані довільного розміру в дайджест фіксованого розміру, який потім підписується.

Потік:

  1. Compute h = SHA-256(дані) (або інший захищений хеш).
  2. Підпишіть хеш закритим ключем: sig = sign(h, priv).
  3. Distribute (data, sig).

To verify:

  1. Compute h' = SHA-256(data).
  2. 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 записує в блокчейн біткойнів). Лише підписання доводить, що «цей підпис було створено раніше, а не в якийсь конкретний час».
Пояснення цифрових підписів: автентичність і неспростовність в одній криптографічній операції