Um esquema de assinatura é formado por três algoritmos: geração de chaves, Sign(sk, m) e Verify(pk, m, σ). O objetivo de segurança padrão é o EUF-CMA: depois de ver assinaturas de mensagens escolhidas por ele, um atacante ainda não consegue produzir uma assinatura válida para nenhuma mensagem nova. O SUF-CMA, mais forte, também proíbe produzir uma segunda assinatura para uma mensagem já assinada, algo que o ECDSA não oferece (veja maleabilidade).
Uma assinatura não oferece confidencialidade, frescor (freshness: uma mensagem assinada válida pode ser repetida, a menos que traga um nonce, um carimbo do tempo ou um público-alvo) nem identidade: ela vincula uma mensagem a uma chave, e outra coisa (um certificado, um endpoint JWKS, o known_hosts, um endereço de blockchain) precisa vincular a chave a uma pessoa ou a um serviço.
Os tamanhos vão de 64 bytes (Ed25519, ECDSA P-256 bruto, BIP-340), passam por 256–512 bytes (RSA) e chegam a kilobytes nos esquemas pós-quânticos: 2.420–4.627 bytes no ML-DSA e 7.856–49.856 no SLH-DSA. Cada formato empacota a mesma assinatura de um jeito: bytes brutos, DER, JWS, COSE_Sign1, SignedData do CMS, pacotes de assinatura OpenPGP, SSHSIG.
Um código de autenticação de mensagem como o HMAC também comprova a integridade, mas com uma chave compartilhada, de modo que qualquer verificador poderia tê-lo produzido; veja HMAC vs assinatura.