Firma digital
Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
La primitiva de firma digital te permite verificar que nadie haya manipulado tus datos. Proporciona autenticidad e integridad, pero no confidencialidad, de los datos firmados. Es asimétrica, lo que significa que usa un par de claves (clave pública y clave privada).
La primitiva de firma digital tiene las siguientes propiedades:
- Autenticidad: Es imposible crear una firma para la que
PublicKeyVerify.Verify(signature, message)
valide, a menos que tengas la clave privada.
- Asimétrica: Para crear la firma, se usa una clave diferente a la que se usa para verificarla. Esto te permite distribuir la clave pública para verificar las firmas a las partes que no pueden crearlas por sí mismas.
Si no necesitas asimetría, considera usar la primitiva MAC más simple y eficiente.
La funcionalidad de las firmas digitales se representa en Tink como un par de primitivas:
- PublicKeySign para firmar datos
- PublicKeyVerify para verificar la firma
Elige un tipo de clave
Recomendamos usar ECDSA_P256 para la mayoría de los casos de uso, pero hay una variedad de opciones. En general, se cumple lo siguiente:
- ECDSA_P256 es la opción más utilizada y una opción predeterminada razonable. Sin embargo, ten en cuenta que las firmas ECDSA son maleables.
- ED25519 crea firmas deterministas y proporciona un mejor rendimiento que ECDSA_P256.
- RSA_SSA_PKCS1_3072_SHA256_F4 crea firmas deterministas y proporciona el mejor rendimiento de verificación (pero la firma es mucho más lenta que ECDSA_P256 o ED25519).
Garantías de seguridad mínimas
- Los datos que se firmarán pueden tener una longitud arbitraria.
- Nivel de seguridad de 128 bits contra ataques de mensaje elegido adaptable para esquemas basados en curvas elípticas
- Nivel de seguridad de 112 bits contra ataques de mensaje elegido adaptable para esquemas basados en RSA (permite claves de 2,048 bits)
Maleabilidad
Un esquema de firma es maleable si un atacante puede crear una firma válida diferente para un mensaje que ya está firmado. Si bien esto no es un problema en la mayoría de los casos, en algunos casos, los programadores suponen implícitamente que las firmas válidas son únicas, y esto puede generar resultados inesperados.
Ejemplo de caso de uso
Consulta Quiero firmar datos de forma digital.
Salvo que se indique lo contrario, el contenido de esta página está sujeto a la licencia Atribución 4.0 de Creative Commons, y los ejemplos de código están sujetos a la licencia Apache 2.0. Para obtener más información, consulta las políticas del sitio de Google Developers. Java es una marca registrada de Oracle o sus afiliados.
Última actualización: 2025-07-25 (UTC)
[null,null,["Última actualización: 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)."]]