Com a primitiva de assinatura digital, você verifica se ninguém adulterou seus dados. Ele 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 assinatura de dados
- PublicKeyVerify para verificar a assinatura
Se a chave privada estiver em um lugar em que a mensagem não pode ser enviada facilmente, como um HSM ou um KMS, consulte Prehash e SignPrehash, que divide a assinatura em uma etapa de hash somente de chave pública e uma etapa de assinatura somente de chave privada.
Escolher um tipo de chave
Recomendamos usar 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 é resistente a ataques quânticos. 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 deterministas e oferece melhor desempenho 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.