web-dev-qa-db-fra.com

REST Sécurité API: HMAC / hachage de clé vs JWT

Je viens de lire cet article qui a quelques années mais décrit une manière intelligente de sécuriser vos REST APIs. Essentiellement:

  • Chaque client possède une paire de clés publique/privée unique
  • Seuls le client et le serveur connaissent la clé privée; il n'est jamais envoyé sur le fil
  • Avec chaque demande, le client prend plusieurs entrées (la demande entière elle-même, l'horodatage actuel et la clé privée) et les exécute via une fonction HMAC pour produire un hachage de la demande
  • Le client envoie ensuite la requête normale (qui contient la clé publique) et le hachage au serveur
  • Le serveur recherche la clé privée du client (sur la base de la clé publique fournie) et vérifie l'horodatage (que je ne comprends pas) qui vérifie que la demande n'est pas victime d'un attaque de relecture
  • Si tout va bien, le serveur utilise la clé privée et la même fonction HMAC pour générer son propre hachage de la demande
  • Le serveur compare ensuite les deux hachages (celui envoyé par le client ainsi que celui qu'il a généré); s'ils correspondent, la demande est authentifiée et autorisée à continuer

Je suis ensuite tombé sur JWT , ce qui semble très similaire. Cependant, le premier article ne mentionne pas du tout JWT, et donc je me demande si JWT est différent de la solution d'authentification ci-dessus, et si oui, comment.

17
smeeb

Commençons par une réponse très basique.

JWT (tel qu'utilisé dans le contexte de OAuth et OpenID) ne nécessite pas de secrets partagés entre le client et l'API. Il y a 3 composants et des paires de 2 partagent un secret chacun: client <-> serveur d'identification , serveur d'identification <-> API.

Cela déplace la plupart de la complexité de l'API vers le serveur d'identification, l'API n'a qu'à vérifier que le jeton a été émis par le serveur d'identification et n'a pas été tempéré. Pour vérifier que l'API vérifie que la signature JWT est valide avec le seul secret partagé connu entre le serveur d'identification et l'API. C'est ça!

La façon dont le serveur d'identification valide l'identité de l'utilisateur peut varier considérablement (dans de nombreux cas, il s'agit de l'ancienne paire nom d'utilisateur + mot de passe via une connexion TLS), mais n'a aucun effet sur votre API.

La confidentialité et la sécurité du message et du jeton lui-même lors de l'utilisation de JWT sont gérées par TLS, JWT ignore ces problèmes.

8
Patrick