Message d’erreur
eth_keys.exceptions.BadSignature: Invalid signature
Également affiché sous la forme
- BadSignature: Invalid signature
web3.py / eth-account / eth-keys (Python) — BadSignature from public-key recovery
Ce que cela signifie
La signature a la bonne longueur, mais ses valeurs ne décrivent aucune signature secp256k1 valide : aucune clé publique ne peut donc être récupérée. r ou s est nul ou n’est pas inférieur à l’ordre de la courbe, ou r n’est pas la coordonnée x d’un point de la courbe. C’est différent d’une signature produite par la mauvaise clé : une telle signature permet de récupérer une autre adresse sans lever d’exception. BadSignature signifie que les octets ne constituent pas du tout une signature.
Pourquoi cela se produit
Une valeur remplie de zéros ou une valeur par défaut
fréquenteDes données de test remplies de zéros, la valeur par défaut d’une colonne de base de données, ou une signature vide complétée à 65 octets par un client.
Octets corrompus
occasionnelleDes signatures endommagées par un aller-retour d’encodage (hex ↔ base64, chaîne ↔ octets) peuvent encore faire 65 octets, mais ne représentent plus un point de la courbe.
Une signature d’un autre schéma
occasionnelleUne signature P-256 (WebAuthn/clé d’accès) ou Ed25519 qui fait justement 64 octets, complétée par un octet v. Ce n’est pas une signature Ethereum.
Comment corriger l’erreur
- 1.
La traiter comme une signature rejetée
Interceptez BadSignature avec les erreurs de longueur et de valeur, et rejetez la requête ; ne réessayez pas avec d’autres valeurs de v.
python from eth_keys.exceptions import BadSignature from eth_utils.exceptions import ValidationError def recover_or_none(message, signature) -> str | None: try: return Account.recover_message(message, signature=signature) except (BadSignature, ValidationError, ValueError): return None # reject the request: the signature is malformed