Beschreibt die Verwendung eines öffentlichen Schlüssels zum Überprüfen und Dekodieren einer JWT-Signatur unter PyJWT, wenn die JWT mit einer Signatur im RS256-Format erstellt wurde. ..
Installieren Sie die Kryptografie des abhängigen Pakets zusammen mit PyJWT, um RSA-Signaturen zu unterstützen, wie in der PyJWT-Dokumentation beschrieben.
$ pip install pyjwt
$ pip install cryptography
Um Kryptografie zu erstellen, müssen Pakete wie libffi-devel und openssl-devel in der Linux-Umgebung installiert werden. Wenn die oben genannte "$ pip install cryptography" nicht installiert werden kann, verwenden Sie diese. bitte bestätigen. In OS X müssen auch Umgebungsvariablen festgelegt werden, was ziemlich kompliziert ist. Weitere Informationen finden Sie in der Dokumentation zur Kryptografie-Installation (https://cryptography.io/en/latest/installation/).
Angenommen, Sie haben den folgenden öffentlichen Schlüssel in pub_key.pem:
pub_key.pem
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAuDopA35ZLa1sgi2QTFbZjH63BrhXw4evehjDiLHrSc5s+jKMSqfd
6BLoQhN7jcOBnofQB/3rEoy6YXkW58lEtVmekQtYAHh11oB8TBBqzNZP1QxKXWjz
8Jely5bJZHztZEzfddDR7yVZF0VSEa0KjiHbqCdAqXKYuAzUMN4dFyS/q0JXvGAr
Jq/LXyVC3EptcZki02p3Nd6KDZHW7hcj+p0xgYNiGCHO7yLf3uHP+7pak5TW0dWf
MC9fl1/oYFILuasW7OV75+vJGs8d92joEC/Lx3S8+gi3z0CWMnCKrWiTtaAKAq8W
yp4Go8WczOQ1rP+bzDj7b/9M3xrjqY3F0wIDAQAB
-----END RSA PUBLIC KEY-----
Übrigens fehlen in diesen Schlüsseldaten die Formatanweisungen "----- RSA PUBLIC KEY BEGINNEN -----" und "----- END RSA PUBLIC KEY -----", was die Ursache ist. Die Überprüfung ist fehlgeschlagen.
Der Code ohne Validierung sieht folgendermaßen aus:
import jwt
encoded_jwt = 'JWT-Daten'
decoded_data = jwt.decode(encoded_jwt, verify=False)
Sie können die Signaturüberprüfung weglassen, indem Sie auf diese Weise im Überprüfungsargument der Funktion jwt.decode () False angeben. Der Standardwert für das Überprüfungsargument ist True, daher müssen Sie explizit False angeben.
Als nächstes folgt der Code zum Überprüfen der Signatur.
from Crypto.PublicKey import RSA
import jwt
encoded_jwt = 'JWT-Daten'
rsa_public_key_pem = open('path/to/pub_key.pem', 'r').read()
rsa_key = RSA.importKey(rsa_public_key_pem)
key = rsa_key.exportKey()
decoded_data = jwt.decode(encoded_jwt, key=key, verify=True)
Lesen Sie den obigen öffentlichen Schlüssel und gehen Sie zuerst die [RSA.importKey () -Methode] durch (https://www.dlitz.net/software/pycrypto/api/current/Crypto.PublicKey.RSA-module.html#importKey). In ein Objekt konvertieren. Die Schlüsseldaten, die mit der exportKey () -Methode dieses RSA-Schlüsselobjekts erhalten wurden Geben Sie im Schlüsselargument der Funktion jwt.decode () an. Geben Sie dann True für das Überprüfungsargument an, um die Signaturüberprüfung anzuzeigen.
Wenn Sie die öffentliche RSA-Schlüsselzeichenfolge so angeben, wie sie im Schlüsselargument der Funktion jwt.decode () enthalten ist, ohne die Schlüsseldaten durch das RSA-Schlüsselobjekt zu konvertieren, wird der Fehler "ValueError: Schlüsseldaten konnten nicht unserialisiert werden" angezeigt. Ich werde.