La compréhension RSA signature pour JWT
Je me suis mise en œuvre d'un signe dans le système avec l'aide de JWT (JsonWebToken) régime. Fondamentalement, une fois qu'un utilisateur se connecter /connexion, le serveur signes d'une JWT et la transmet au client.
Le client retourne alors le jeton à chaque requête et le serveur verifyies le jeton avant de renvoyer une réponse.
C'est à peu près la façon dont vous vous attendez, mais je vais avoir un problème avec la logique du processus. De tous les articles mathématiques que j'ai lu, il semble que le RSA signature utilise des clés asymétriques pour la signature. Comme la clé publique, comme son nom l'indique, est exposée au client et la clé privée est conservée sur le serveur, il est logique de signer le JWT avec la clé publique qui est envoyé au client et vérifiez sur le côté serveur à l'aide de la clé privée.
Cependant, sur chaque exemple et de la bibliothèque, je vois qu'il semble être dans l'autre sens. Aucune idée du pourquoi c'est ainsi ? Si un JWT est signé avec la clé privée et vérifiées avec le public que ce qui est le point?
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, toutes mes excuses, cette réponse a obtenu assez long.
Si vous utilisez RSA pour crypter vos jetons, et un client de connexion est un navigateur web, le client ne verra jamais les clés RSA (public ou privé). C'est parce que le client, vraisemblablement, n'a pas besoin de vérifier que le JWT est valide, seul le serveur a besoin de le faire. Le client tient juste sur le JWT et montre il sur le serveur lorsque demandé. Puis, le serveur vérifie la validité de son quand il voit le jeton.
Alors pourquoi auriez-vous besoin d'une clé publique /privée combo pour JWT est? Et bien d'abord, vous n'avez pas besoin d'utiliser une clé publique /clé privée de l'algorithme.
Vous pouvez encoder JWT avec un certain nombre de différents algorithmes, RSA étant l'un d'eux. D'autres choix populaires pour l'encodage de votre JWT sont ECDSA ou HMAC algorithmes (le JWT standard prend en charge les autres aussi). HMAC, précisément, n'est pas une clé publique /privée schéma. Il y a juste une clé, la clé, qui est utilisée pour crypter et décrypter les jetons. Vous pouvez penser ce que l'utilisation de la clé privée à la fois la signature et le décryptage de l'JWT est. Je ne suis pas un expert sur ce par tous les moyens, mais voici les conclusions que j'en suis venu à faire mes propres recherches récemment:
À l'aide de l'algorithme HMAC est sympa parce que c'est l'option la plus rapide. Toutefois, afin de décrypter le JWT, vous devez donner à quelqu'un le une clé qui fait tout, le Partage de cette clé avec quelqu'un d'autre que cette personne pouvait désormais signe jetons et faire semblant comme si ils sont à vous. Si vous êtes à la construction de multiples applications serveur qui toutes doivent être en mesure de vérifier votre JWT, vous pourriez voulez pas que tous ont la possibilité d'encoder des jetons (de la part de différents programmeurs pourraient être maintenir les différentes applications, le partage de la capacité de cryptage avec plus de gens est un risque de sécurité, etc). Dans ce cas, il est préférable d'en avoir un, étroitement contrôlée clé privée (et une seule application qui ne la signature) et de partager la clé publique de autour avec d'autres personnes afin de leur donner la possibilité de vérifier les jetons. Ici, la clé privée est utilisée pour crypter les jetons, et la clé publique est utilisée pour le déchiffrement eux. Dans ce cas, vous voulez choisir RSA ou ECDSA.
Les recherches que j'ai fait des points de RSA étant la meilleure option pour la plupart des JWT applications dans ce scénario. C'est parce que votre application sera, théoriquement, de la vérification des jetons fréquemment. RSA est beaucoup plus rapide, puis ECDSA à la vérification. ECDSA est principalement nice parce que les touches sont plus petites en taille. De ce fait mieux pour les certificats https parce que vous avez besoin pour envoyer la clé publique sur le navigateur du client. Dans le JWT scénario cependant, les touches sont de rester sur un serveur de sorte que la taille de stockage est de n/a et la vérification de la vitesse est plus importante.
Conclusion: si vous êtes à la construction d'une petite application sans de multiples petites "micro-applications de service' /vous êtes le seul développeur, probablement choisir HMAC pour chiffrer vos clés. Sinon, probablement choisir RSA. Encore une fois cependant, je ne suis pas un expert, juste quelqu'un qui a récemment googlé ce sujet, afin de prendre cela avec un grain de sel.
Votre suggestion:
n'est pas correct. La signature se fait avec la clé privée du serveur, le chiffrement est fait avec la clé publique du client. C'est la façon dont ICP fonctionne en général.
Il y a une différence entre la signature/vérification et de cryptage/décryptage de données, mais la sémantique peut être similaire.
Vous signer des données avec une clé privée qui ne contrôle les sources ont donc toute personne qui reçoit des renseignements peuvent utiliser votre clé publique pour valider cette information était, en effet, envoyé par vous, et est la même information que vous souhaitez envoyer.
Vous chiffrer les données avec une clé publique et déchiffrer avec sa clé privée. Cela semble contraire mais vraiment, il suit la même logique concept comme une signature. Si vous souhaitez envoyer des données entre la personne A et une personne B, les deux personnes ont une paire clé publique/privée et qu'ils partagent leurs clés publiques les uns avec les autres quand ils se rencontrent (poignée de main). Un construit un message de B et de crypter à l'aide de B de la clé publique et l'envoie à B. Maintenant, pas l'un sans B de la clé privée peut déchiffrer le message, y compris Un - même si, au départ, l'a envoyé.
En termes de JWT, un JWT charge utile par lui-même est juste codé en Base64 JSON avec certains champs normalisés. La signature permet à quelqu'un avec la clé publique afin de valider l'information n'a pas été modifié par quelqu'un dans le milieu. Semblable à une somme de contrôle, mais avec une certaine sécurité supplémentaire en fonction des affinités des sentiments. Le contenu de la signature de JWT sont facilement visibles (base64 encode comme unicode ou utf-8, pas de chiffrement) pour l'utilisateur final et n'importe qui dans le milieu qui est pourquoi il est généralement mal vu d'envoyer des données sensibles dans un JWT comme les mots de passe ou PII.
Comme d'autres l'ont mentionné, la plupart des JWTs contiennent des informations non prévu pour les clients, mais pour aider à faciliter la apatrides partie des services RESTful. Généralement, un JWT contiendra un accountid d'utilisateur et souvent autorisations que "les revendications". Une API d'extrémité peut vérifier la signature et raisonnablement confiance à l'prétend pas être modifié par le client. Le client n'ait à envoyer le JWT pour chaque requête qui enregistre le point de terminaison d'avoir à faire beaucoup de base de données d'avant en arrière pour arriver où ils en sont par tout simplement la vérification d'une signature avec une clé publique.
En outre, signé JWTs peut être chiffré. Selon le JWE spec, la charge utile est chiffré à compter de la signature et ensuite déchiffré avant de vérifier. L'avantage ici est que tous les points de terminaison doit également disposer de la clé privée pour déchiffrer le JWT, mais les utilisateurs ne seront pas en mesure de voir le contenu de la JWT. Je dis compromis parce qu'en général, les clés privées sont destinés à être conservés en lieu sûr et le plus répandu de la clé privée est un peu moins sûr. La sécurité, l'évaluation des risques et des coûts/avantages de chiffrement est une toute autre bête 🙂