Fehlermeldung
eth_keys.exceptions.BadSignature: Invalid signature
Auch ausgegeben als
- BadSignature: Invalid signature
web3.py / eth-account / eth-keys (Python) — BadSignature from public-key recovery
Was der Fehler bedeutet
Die Signatur hat die richtige Länge, aber ihre Werte beschreiben keine gültige secp256k1-Signatur, daher lässt sich kein öffentlicher Schlüssel wiederherstellen: r oder s ist null oder nicht kleiner als die Kurvenordnung, oder r ist nicht die x-Koordinate eines Punkts auf der Kurve. Das ist etwas anderes als eine Signatur mit dem falschen Schlüssel – aus einer solchen Signatur wird ohne jede Exception eine andere Adresse wiederhergestellt. BadSignature bedeutet, dass die Bytes überhaupt keine Signatur sind.
Warum der Fehler auftritt
Ein mit Nullen gefüllter Wert oder ein Standardwert
häufigMit Nullen gefüllte Fixtures, der Standardwert einer Datenbankspalte oder eine leere Signatur, die ein Client auf 65 Byte aufgefüllt hat.
Beschädigte Bytes
gelegentlichSignaturen, die beim Kodieren hin und zurück (hex ↔ base64, String ↔ Bytes) beschädigt wurden, können noch 65 Byte lang sein, stellen aber keinen Kurvenpunkt mehr dar.
Eine Signatur aus einem anderen Verfahren
gelegentlichEine P-256-Signatur (WebAuthn/Passkey) oder Ed25519-Signatur, die zufällig 64 Byte lang ist und mit einem v-Byte aufgefüllt wurde. Sie ist keine Ethereum-Signatur.
So behebst du den Fehler
- 1.
Als abgelehnte Signatur behandeln
Fange BadSignature zusammen mit Längen- und Wertfehlern ab und lehne die Anfrage ab; versuche es nicht erneut mit anderen v-Werten.
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