Message d’erreur
cryptography.exceptions.InvalidSignature
L’exception est levée sans aucun texte de message : la trace d’appels se termine par le seul nom de la classe (reproduit avec cryptography 50.0).
Python cryptography — raised by verify()
Ce que cela signifie
public_key.verify(signature, data, ...) a déterminé que la signature ne se vérifie pas pour ces données avec cette clé. Tout a été analysé correctement ; la vérification a simplement échoué. Comme l’exception ne contient volontairement aucun détail, le diagnostic consiste à tester séparément chaque entrée : la clé, les octets des données, l’encodage de la signature, la fonction de hachage.
Pourquoi cela se produit
Signature r‖s brute là où du DER est attendu
fréquenteDans cryptography, verify() pour ECDSA attend du DER ASN.1. Une signature brute de 64 octets provenant de WebCrypto, de JWS ou du mode « raw » d’une autre bibliothèque n’est pas signalée comme malformée : verify() lève la même InvalidSignature sans message que pour une signature falsifiée, et c’est ce qui rend cette confusion si facile à manquer.
Les octets des données diffèrent
fréquenteDifférences d’encodage entre str et bytes, saut de ligne final, resérialisation JSON avec un autre ordre des clés ou d’autres espaces : verify() signe ou vérifie des octets exacts, et « sémantiquement identique » ne veut pas dire identique.
Double hachage par mauvais usage de Prehashed
fréquenteverify(sig, data, ec.ECDSA(hashes.SHA256())) hache lui-même data. Passer un condensat déjà calculé sans utils.Prehashed hache ce condensat une seconde fois : c’est l’une des 3 causes les plus fréquentes d’échecs de vérification mystérieux.
Mauvaise clé ou mauvaise fonction de hachage
occasionnelleUne clé publique remplacée lors d’une rotation ou qui ne correspond pas, ou une vérification avec SHA-256 de ce qui a été signé avec SHA-384. La fonction de hachage fait partie du schéma de signature, ce n’est pas un paramètre libre.
Comment corriger l’erreur
- 1.
Convertir les signatures brutes en DER
Si la signature fait 64 octets (P-256), séparez-la en r et s et réencodez-la en DER avant de la vérifier.
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.
Utiliser Prehashed pour les condensats précalculés
Quand vous disposez du condensat au lieu du message, dites-le explicitement : sinon, la bibliothèque hache votre condensat.
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.
Identifier l’entrée fautive
Collez la clé, le message et la signature dans l’outil d’explication des erreurs ci-dessous : il teste les hypothèses de discordance habituelles (mauvaise fonction de hachage, brut ou DER, double hachage, normalisation high-S, mauvaise courbe) et indique celle qui permet à votre signature de se vérifier.