Fehlermeldung
cryptography.exceptions.InvalidSignature
Die Exception wird ohne Meldungstext ausgelöst – der Traceback endet mit dem bloßen Klassennamen (reproduziert mit cryptography 50.0).
Python cryptography — raised by verify()
Was der Fehler bedeutet
public_key.verify(signature, data, ...) hat festgestellt, dass die Signatur für diese Daten mit diesem Schlüssel nicht gültig ist. Geparst wurde alles fehlerfrei; nur die Prüfung ist fehlgeschlagen. Weil die Exception absichtlich keine Details enthält, heißt Diagnose: jede Eingabe einzeln testen – Schlüssel, Datenbytes, Kodierung der Signatur, Hash.
Warum der Fehler auftritt
Rohe r‖s-Signatur, wo DER erwartet wird
häufigverify() für ECDSA in cryptography erwartet ASN.1-DER. Eine rohe 64-Byte-Signatur aus WebCrypto, JWS oder dem „raw“-Modus einer anderen Bibliothek wird nicht als fehlerhaft formatiert gemeldet: verify() löst dasselbe nackte InvalidSignature aus wie bei einer Fälschung – genau deshalb wird diese Verwechslung so leicht übersehen.
Die Datenbytes unterscheiden sich
häufigKodierungsunterschiede zwischen str und bytes, ein Zeilenumbruch am Ende, eine erneute JSON-Serialisierung mit anderer Schlüsselreihenfolge oder anderem Whitespace – verify() arbeitet wie das Signieren mit exakten Bytes, und „semantisch identisch“ ist nicht identisch.
Doppeltes Hashing durch falsche Verwendung von Prehashed
häufigverify(sig, data, ec.ECDSA(hashes.SHA256())) hasht data selbst. Übergibst du einen bereits berechneten Digest ohne utils.Prehashed, wird der Digest noch einmal gehasht – eine der 3 häufigsten Ursachen für rätselhaft fehlschlagende Signaturprüfungen.
Falscher Schlüssel oder falscher Hash
gelegentlichEin rotierter oder nicht passender öffentlicher Schlüssel oder eine Prüfung mit SHA-256, obwohl mit SHA-384 signiert wurde. Der Hash ist Teil des Signaturverfahrens, kein frei wählbarer Parameter.
So behebst du den Fehler
- 1.
Rohe Signaturen in DER umwandeln
Ist die Signatur 64 Byte lang (P-256), teile sie in r und s auf und kodiere sie vor der Prüfung neu als DER.
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.
Prehashed für vorab berechnete Digests verwenden
Hast du den Digest statt der Nachricht, sag das ausdrücklich – sonst hasht die Bibliothek deinen 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.
Herausfinden, welche Eingabe falsch ist
Füge Schlüssel, Nachricht und Signatur unten in das Tool zur Fehlerdiagnose ein: Es testet die üblichen Hypothesen für eine Abweichung – falscher Hash, Rohformat statt DER, doppeltes Hashing, High-S-Normalisierung, falsche Kurve – und nennt die, mit der deine Signatur gültig wird.