Mensagem de erro
cryptography.exceptions.InvalidSignature
A exceção é lançada sem texto de mensagem — o traceback termina no nome da classe, sem mais nada (reproduzido com cryptography 50.0).
Python cryptography — raised by verify()
O que significa
public_key.verify(signature, data, ...) concluiu que a assinatura não passa na verificação para estes dados com esta chave. Tudo foi lido sem erro; a verificação simplesmente falhou. Como a exceção não traz detalhes por design, o diagnóstico exige testar cada entrada separadamente — chave, bytes dos dados, codificação da assinatura, hash.
Por que acontece
Assinatura raw r‖s onde se espera DER
comumO verify() de ECDSA da biblioteca cryptography recebe ASN.1 DER. Uma assinatura raw de 64 bytes vinda da WebCrypto, do JWS ou do modo “raw” de outra biblioteca não é relatada como malformada: verify() lança a mesma InvalidSignature sem mensagem que uma falsificação lançaria, e é isso que torna essa confusão tão fácil de passar despercebida.
Os bytes dos dados são diferentes
comumDiferenças de codificação entre str e bytes, uma quebra de linha no final, a reserialização do JSON com outra ordem de chaves ou outros espaços em branco — verify() assina/verifica bytes exatos, e “semanticamente idêntico” não é idêntico.
Hash duplo pelo uso incorreto de Prehashed
comumverify(sig, data, ec.ECDSA(hashes.SHA256())) calcula o hash de data por conta própria. Se você passar um digest já calculado sem utils.Prehashed, o hash do digest é calculado de novo — uma das 3 causas mais comuns de falhas misteriosas de verificação.
Chave errada ou hash errado
ocasionalUma chave pública que foi rotacionada ou que não corresponde, ou uma verificação com SHA-256 de algo que foi assinado com SHA-384. O hash faz parte do esquema de assinatura; não é um parâmetro livre.
Como corrigir
- 1.
Converter assinaturas raw para DER
Se a assinatura tem 64 bytes (P-256), divida-a em r e s e codifique de novo em DER antes de verificar.
python from cryptography.hazmat.primitives.asymmetric.utils import encode_dss_signature r = int.from_bytes(raw_sig[:32], "big") s = int.from_bytes(raw_sig[32:], "big") der_sig = encode_dss_signature(r, s) public_key.verify(der_sig, message, ec.ECDSA(hashes.SHA256())) - 2.
Usar Prehashed para digests já calculados
Quando você tem o digest em vez da mensagem, diga isso explicitamente — senão a biblioteca calcula o hash do seu hash.
python from cryptography.hazmat.primitives.asymmetric import utils public_key.verify( der_sig, digest_bytes, # already SHA-256(message) ec.ECDSA(utils.Prehashed(hashes.SHA256())), ) - 3.
Descobrir qual entrada está errada
Cole a chave, a mensagem e a assinatura no explicador de erros abaixo: ele testa as hipóteses de divergência mais comuns — hash errado, raw vs. DER, hash duplo, normalização high-S, curva errada — e aponta aquela que faz sua assinatura passar na verificação.