[PYTHON] Überprüfen Sie die JWT-Signatur mit PyJWT mithilfe des öffentlichen Schlüssels im PKCS # 1-Format

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. ..

Vorbereitungen

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/).

Beispiel für einen öffentlichen Schlüssel

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.

Dekodiere JWT mit PyJWT

Ohne Überprüfung der Unterschrift

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.

Bei der Überprüfung der Signatur

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.

Recommended Posts

Überprüfen Sie die JWT-Signatur mit PyJWT mithilfe des öffentlichen Schlüssels im PKCS # 1-Format
SSH-Verbindung mit öffentlichem Schlüssel