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".