Assinatura digital
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
A primitiva de assinatura digital permite verificar se ninguém adulterou
seus dados. Ele garante a autenticidade e a integridade, mas não o sigilo, dos
dados assinados. Ela é assimétrica, ou seja, usa um par de chaves (chave pública e
chave privada).
A primitiva de assinatura digital tem as seguintes propriedades:
- Autenticidade: é impossível criar uma assinatura validada por
PublicKeyVerify.Verify(signature, message)
, a menos que você tenha a
chave privada.
- Assimetria: chaves diferentes são usadas nas etapas de criação e verificação da assinatura. Dessa maneira, você consegue distribuir a chave pública com o objetivo de verificar assinaturas para pessoas que não podem criar assinaturas por conta própria.
Se você não precisar de assimetria, use a primitiva MAC (link em inglês) mais simples e eficiente.
A funcionalidade das assinaturas digitais é representada no Tink como um par de
primitivas:
- PublicKeySign para assinar dados
- PublicKeyVerify para verificar a assinatura
Escolher um tipo de chave
Recomendamos o uso de ECDSA_P256 para a maioria dos casos de uso, mas há várias
opções. Em geral, o seguinte é verdadeiro:
- ECDSA_P256 é a opção mais usada e uma configuração padrão razoável. No entanto,
as assinaturas ECDSA são maleáveis.
- O ED25519 cria assinaturas determinísticas e oferece melhor desempenho
do que o ECDSA_P256.
- RSA_SSA_PKCS1_3072_SHA256_F4 cria assinaturas determinísticas e oferece
a melhor performance de verificação, mas a assinatura é muito mais lenta do que
ECDSA_P256 ou ED25519.
Garantias mínimas de segurança
- Os dados a serem assinados podem ter comprimento arbitrário
- Nível de segurança de 128 bits contra ataques adaptativos de mensagem escolhida para esquemas
com base em curva elíptica
- Nível de segurança de 112 bits contra ataques adaptativos de mensagem escolhida para esquemas baseados em RSA (permite chaves de 2048 bits)
Maleabilidade
Um esquema de assinatura é maleável se um invasor puder criar uma assinatura válida
diferente para uma mensagem já assinada. Embora isso não seja um problema para a maioria
dos cenários, em alguns casos, os programadores presumem implicitamente que assinaturas válidas são
únicas, e isso pode levar a resultados inesperados.
Exemplo de caso de uso:
Consulte "Quero assinar dados digitalmente".
Exceto em caso de indicação contrária, o conteúdo desta página é licenciado de acordo com a Licença de atribuição 4.0 do Creative Commons, e as amostras de código são licenciadas de acordo com a Licença Apache 2.0. Para mais detalhes, consulte as políticas do site do Google Developers. Java é uma marca registrada da Oracle e/ou afiliadas.
Última atualização 2025-07-25 UTC.
[null,null,["Última atualização 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)."]]