Podpis cyfrowy
Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Pierwotny typ podpisu cyfrowego umożliwia sprawdzenie, czy nikt nie wprowadził zmian w Twoich danych. Zapewnia autentyczność i integralność danych, ale nie ich poufność. Jest to algorytm asymetryczny, czyli wykorzystuje parę kluczy (klucz publiczny i klucz prywatny).
Pierwotny element podpis cyfrowy ma te właściwości:
- Autentyczność: niemożliwe jest utworzenie podpisu, który
PublicKeyVerify.Verify(signature, message)
zweryfikuje, chyba że masz klucz prywatny.
- Asymetryczny: do utworzenia podpisu używany jest inny klucz niż do jego weryfikacji. Dzięki temu możesz rozpowszechniać klucz publiczny, aby weryfikować podpisy w przypadku podmiotów, które nie mogą samodzielnie tworzyć podpisów.
Jeśli nie potrzebujesz asymetrii, rozważ użycie prostszego i bardziej wydajnego prymitywu MAC.
Funkcje podpisów cyfrowych są w Tink reprezentowane przez parę prymitywów:
- PublicKeySign do podpisywania danych
- PublicKeyVerify do weryfikacji podpisu
Wybieranie typu klucza
W większości przypadków zalecamy używanie ECDSA_P256, ale istnieje wiele opcji. Ogólnie obowiązują następujące zasady:
- ECDSA_P256 to najczęściej używana opcja i domyślna opcja. Pamiętaj jednak, że podpisy ECDSA są zmienialne.
- ED25519 tworzy podpisy deterministyczne i zapewnia lepszą wydajność niż ECDSA_P256.
- RSA_SSA_PKCS1_3072_SHA256_F4 tworzy podpisy deterministyczne 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 zabezpieczeń przed dostosowywanymi atakami typu „wybrany komunikat” w przypadku schematów opartych na krzywej eliptycznej
- 112-bitowy poziom zabezpieczeń przed atakami dostosowanymi do wybranych wiadomości w schematach opartych na RSA (umożliwia używanie kluczy 2048-bitowych)
Złożoność
Schemat podpisu jest podatny na manipulację, jeśli atakujący może utworzyć inny prawidłowy podpis dla już podpisanej wiadomości. W większości przypadków nie jest to problemem, ale w niektórych przypadkach programiści domyślnie uznają, że prawidłowe podpisy są unikalne, co może prowadzić do nieoczekiwanych wyników.
Przykładowy przypadek użycia
Zobacz, jak podpisać dane cyfrowo.
O ile nie stwierdzono inaczej, treść tej strony jest objęta licencją Creative Commons – uznanie autorstwa 4.0, a fragmenty kodu są dostępne na licencji Apache 2.0. Szczegółowe informacje na ten temat zawierają zasady dotyczące witryny Google Developers. Java jest zastrzeżonym znakiem towarowym firmy Oracle i jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2025-07-25 UTC.
[null,null,["Ostatnia aktualizacja: 2025-07-25 UTC."],[[["\u003cp\u003eDigital signatures ensure data integrity and authenticity by verifying that data hasn't been tampered with.\u003c/p\u003e\n"],["\u003cp\u003eThey use a pair of keys (public and private) for asymmetric signing and verification, allowing for secure distribution of the public key.\u003c/p\u003e\n"],["\u003cp\u003eTink provides two primitives for digital signatures: \u003ccode\u003ePublicKeySign\u003c/code\u003e for signing and \u003ccode\u003ePublicKeyVerify\u003c/code\u003e for verifying.\u003c/p\u003e\n"],["\u003cp\u003eECDSA_P256 is generally recommended, with ED25519 offering better performance and RSA_SSA_PKCS1_3072_SHA256_F4 providing the fastest verification.\u003c/p\u003e\n"],["\u003cp\u003eDigital signatures in Tink guarantee a minimum of 112-bit security and support data of any length.\u003c/p\u003e\n"]]],["Digital signatures ensure data authenticity and integrity using asymmetric key pairs (public and private). `PublicKeySign` signs data, while `PublicKeyVerify` checks signatures. Key options include the widely used ECDSA_P256, faster ED25519, and high-verification-performance RSA_SSA_PKCS1_3072_SHA256_F4. Signatures offer 128-bit security (elliptic curves) or 112-bit security (RSA). ECDSA signatures are malleable, allowing attackers to forge valid signatures. If asymmetry is not needed consider using MAC.\n"],null,["# Digital Signature\n\nThe Digital Signature primitive lets you verify that no one has tampered with\nyour data. It provides authenticity and integrity, but not secrecy, of the\nsigned data. It is asymmetric, meaning it uses a pair of keys (public key and\nprivate key).\n\nThe Digital Signature primitive has the following properties:\n\n- **Authenticity** : It is impossible to create a signature for which `PublicKeyVerify.Verify(signature, message)` validates, unless you have the private key.\n- **Asymmetric**: Creating the signature uses a different key than verifying it. This lets you distribute the public key to verify signatures to parties that can't create signatures themselves.\n\nIf you don't need asymmetry, consider using the simpler and more efficient\n[MAC](/tink/mac) primitive instead.\n\nThe functionality of digital signatures is represented in Tink as a pair of\nprimitives:\n\n- *PublicKeySign* for signing data\n- *PublicKeyVerify* for verifying the signature\n\n### Choose a key type\n\nWe recommend using **ECDSA_P256** for most use cases, but there are a variety of\noptions. In general, the following holds true:\n\n- ECDSA_P256 is the most widely used option and a reasonable default. Note though that ECDSA signatures are [malleable](#malleable).\n- ED25519 creates deterministic signatures and provides better performance than ECDSA_P256.\n- RSA_SSA_PKCS1_3072_SHA256_F4 creates deterministic signatures and provides the best verification performance (but signing is much slower than ECDSA_P256 or ED25519).\n\n### Minimal security guarantees\n\n- Data to be signed can have arbitrary length\n- 128-bit security level against adaptive chosen-message attacks for elliptic curve based schemes\n- 112-bit security level against adaptive chosen-message attacks for RSA based schemes (allows 2048-bit keys)\n\n### Malleability\n\nA signature scheme is malleable if an attacker can create a different valid\nsignature for an already signed message. While this is not a problem for most\nscenarios, in some cases programmers implicitly assume that valid signatures are\nunique, and this can lead to unexpected results.\n\n### Example use case\n\nSee I want to [digitally sign data](/tink/digitally-sign-data)."]]