Com a primitiva de assinatura digital, você verifica se ninguém adulterou seus dados. Ela oferece autenticidade e integridade, mas não sigilo, dos dados assinados. Ela é assimétrica, ou seja, usa um par de chaves pública e 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. - Assimétrica: 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, que é mais simples e eficiente.
A funcionalidade de assinaturas digitais é representada no Tink como um par de primitivos:
- PublicKeySign para assinar dados
- PublicKeyVerify para verificar a assinatura
Escolher um tipo de chave
Recomendamos o uso de ML_DSA_65 ou ECDSA_P256 para a maioria dos casos de uso, mas há várias opções. Em geral, o seguinte é verdadeiro:
- O ML-DSA-65 é seguro para a computação quântica. Estamos implementando ativamente essa ferramenta, e agora ela é recomendada para linguagens de programação em que está disponível.
Para os seguintes algoritmos não pós-quânticos, você precisará mudar o tipo de chave em breve.
- ECDSA_P256 é a opção mais usada e um padrão razoável. No entanto, as assinaturas ECDSA são maleáveis.
- O ED25519 cria assinaturas determinísticas e oferece um desempenho melhor do que o ECDSA_P256.
- RSA_SSA_PKCS1_3072_SHA256_F4 cria assinaturas determinísticas e oferece o melhor desempenho 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 adaptáveis de mensagem escolhida para esquemas baseados em curva elíptica.
- Nível de segurança de 112 bits contra ataques adaptáveis 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 na maioria dos cenários, em alguns casos, os programadores presumem implicitamente que as assinaturas válidas são exclusivas, o que pode levar a resultados inesperados.
Exemplo de caso de uso:
Quero assinar dados digitalmente.