Funkcja podpisu cyfrowego umożliwia sprawdzenie, czy nikt nie manipulował Twoimi danymi. Zapewnia autentyczność i integralność podpisanych danych, ale nie ich poufność. Jest to szyfrowanie asymetryczne, co oznacza, że używa pary kluczy (klucza publicznego i klucza prywatnego).
Element podstawowy Podpis cyfrowy ma te właściwości:
- Autentyczność: nie można utworzyć podpisu, który zostałby zweryfikowany przez
PublicKeyVerify.Verify(signature, message), jeśli nie masz klucza prywatnego. - Asymetryczny: do utworzenia podpisu używany jest inny klucz niż do jego weryfikacji. Dzięki temu możesz rozpowszechniać klucz publiczny do weryfikacji podpisów wśród podmiotów, które nie mogą samodzielnie tworzyć podpisów.
Jeśli nie potrzebujesz asymetrii, rozważ użycie prostszego i wydajniejszego prymitywu MAC.
Funkcjonalność podpisów cyfrowych jest reprezentowana w Tink jako para elementów pierwotnych:
- PublicKeySign do podpisywania danych.
- PublicKeyVerify do weryfikacji podpisu.
Jeśli klucz prywatny znajduje się w miejscu, do którego nie można łatwo wysłać wiadomości, np. w module HSM lub usłudze KMS, zapoznaj się z sekcją Prehash i SignPrehash, która dzieli podpisywanie na krok mieszania tylko za pomocą klucza publicznego i krok podpisywania tylko za pomocą klucza prywatnego.
Wybierz typ klucza
W większości przypadków zalecamy używanie algorytmów ML_DSA_65 lub ECDSA_P256, ale dostępnych jest wiele opcji. Ogólnie rzecz biorąc, obowiązują te zasady:
- Algorytm ML-DSA-65 jest odporny na złamanie za pomocą komputera kwantowego. Aktywnie wdrażamy tę funkcję i jest ona obecnie zalecana w przypadku języków programowania, w których jest dostępna.
W przypadku tych algorytmów niepostkwantowych w najbliższej przyszłości konieczna będzie zmiana typu klucza.
- ECDSA_P256 to najczęściej używana opcja i rozsądna wartość domyślna. Pamiętaj jednak, że podpisy ECDSA są podatne na modyfikacje.
- ED25519 tworzy deterministyczne podpisy i zapewnia lepszą wydajność niż ECDSA_P256.
- RSA_SSA_PKCS1_3072_SHA256_F4 tworzy deterministyczne podpisy i zapewnia najlepszą wydajność weryfikacji (ale podpisywanie jest znacznie wolniejsze niż w przypadku ECDSA_P256 lub ED25519).
Minimalne gwarancje bezpieczeństwa
- Dane do podpisania mogą mieć dowolną długość.
- 128-bitowy poziom bezpieczeństwa w przypadku adaptacyjnych ataków z wybraną wiadomością w schematach opartych na krzywych eliptycznych
- poziom bezpieczeństwa 112 bitów w przypadku schematów opartych na RSA, które są odporne na adaptacyjne ataki z wybranym komunikatem (umożliwia stosowanie kluczy 2048-bitowych);
Kowalność
Schemat podpisu jest podatny na modyfikacje, jeśli atakujący może utworzyć inny prawidłowy podpis dla już podpisanego komunikatu. W większości przypadków nie stanowi to problemu, ale w niektórych sytuacjach programiści zakładają, że prawidłowe sygnatury są unikalne, co może prowadzić do nieoczekiwanych wyników.
Przypadek użycia
Zobacz sekcję Chcę podpisać cyfrowo dane.