Assinatura digital

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