[PYTHON] Vérifiez la signature JWT avec PyJWT à l'aide de la clé publique au format PKCS # 1

Décrit comment utiliser une clé publique pour valider et décoder une signature JWT sur PyJWT si le JWT a été créé avec une signature au format RS256. ..

Préparation préalable

Pour prendre en charge les signatures RSA comme décrit dans la documentation PyJWT, installez la cryptographie du package dépendant avec PyJWT.

$ pip install pyjwt
$ pip install cryptography

Pour construire la cryptographie, vous devez avoir des packages tels que libffi-devel et openssl-devel installés dans l'environnement Linux, donc si l'installation ci-dessus `` $ pip install cryptography '' échoue, utilisez-les. Veuillez confirmer. Sous OS X, il est également nécessaire de définir des variables d'environnement, ce qui est assez compliqué. Consultez la documentation d'installation de la cryptographie (https://cryptography.io/en/latest/installation/) pour plus d'informations.

Exemple de clé publique

Supposons que vous ayez la clé publique suivante dans 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-----

Par ailleurs, les instructions de format "----- BEGIN RSA PUBLIC KEY -----" et "----- END RSA PUBLIC KEY -----" sont absentes de ces données clés, ce qui en est la cause. La vérification a échoué.

Décoder JWT avec PyJWT

Sans vérification de signature

Le code sans validation ressemble à ceci:

import jwt

encoded_jwt = 'Données JWT'
decoded_data = jwt.decode(encoded_jwt, verify=False)

Vous pouvez omettre la vérification de signature en spécifiant False dans l'argument de vérification de la fonction jwt.decode () de cette façon. La valeur par défaut de l'argument de vérification est True, vous devez donc spécifier explicitement False.

Lors de la vérification de la signature

Vient ensuite le code pour vérifier la signature.

from Crypto.PublicKey import RSA
import jwt

encoded_jwt = 'Données JWT'

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)

Lisez la clé publique ci-dessus et passez d'abord par la méthode RSA.importKey () Convertissez en objet. Les données clés obtenues à partir de la méthode exportKey () de cet objet clé RSA Spécifiez dans l'argument clé de la fonction jwt.decode (). Spécifiez ensuite True pour l'argument de vérification pour indiquer la vérification de la signature.

Si vous spécifiez la chaîne de clé publique RSA telle qu'elle est dans l'argument de clé de la fonction jwt.decode () sans convertir les données de clé par l'objet clé RSA, vous obtiendrez l'erreur ValueError: Could not unserialize key data.`. Je vais.

Recommended Posts

Vérifiez la signature JWT avec PyJWT à l'aide de la clé publique au format PKCS # 1
Connexion SSH à l'aide de la clé publique