Nous travaillons sur un nouveau projet, nous sommes deux développeurs principaux et nous sommes à la croisée des chemins sur la façon d'utiliser un token pour sécuriser la communication entre le serveur et le client.
Première suggestion: (le jeton statique AKA à jeton unique)
le client demande un jeton principal, en envoyant le nom d'utilisateur et le mot de passe et l'heure_courante (cette variable sera enregistrée dans la base de données du serveur et côté client également) à l'api, le serveur interprète l'entrée et rend un jeton haché (par exemple: 58f52c075aca5d3e07869598c4d66648) l'enregistre dans la base de données et le renvoie au client.
Le client enregistre maintenant le jeton principal et crée un nouveau jeton haché en utilisant le jeton principal + la variable current_time envoyée dans la demande d'authentification (permet d'appeler ce nouveau jeton, main_token) également le serveur fait de même et crée le même jeton en utilisant le même algorithme .
Chaque fois que le client interroge l'API du serveur, il envoie le main_token au serveur, maintenant le serveur compare le jeton généré en lui, avec le main_token envoyé par le client, s'il correspond, cela signifie que l'utilisateur est réel
Deuxième suggestion: (jeton dynamique)
Le client génère deux clés aléatoires ($ key1 = rand (10000,90000); $ key2 = rand (10000,90000);) À chaque demande sur l'API, le client crée un hachage à l'aide du type de requête et les deux clés avec un algorithme complexe, et envoie ces deux clés + le hachage au serveur
Le serveur, en utilisant le même algorithme utilisé dans le client, crée un hachage et le compare à celui envoyé par le client, s'il correspond, le serveur continue de traiter la requête
Maintenant, la question est: Laquelle est la façon la plus logique et la plus sûre d'utiliser pour sécuriser les demandes d'API?
Réponses:
J'aime vraiment la première approche en général.
Une chose que je ne vois pas mentionnée à propos de la première que vous devez garder à l'esprit, l'horodatage utilisé pour hacher le jeton doit avoir une expiration TTL qui est extrêmement courte (comme 1 seconde), donc vous vérifiez que le message n'a pas été envoyé avec le même horodatage et jeton d'un message 12 heures plus tôt; évidemment, il serait calculé comme légitime, mais ce n'est pas le cas dans ce cas.
Si ce sont les deux seules options que vous envisagez, je voudrais simplement m'assurer que vous avez également examiné d'autres approches, car il y en a beaucoup. Plus que je ne vais en énumérer en fait. Ce sont des approches d'authentification courantes qui méritent d'être étudiées juste pour voir si elles pourraient mieux convenir à votre objectif, et si rien d'autre les comprendre ne peut vous donner quelques idées pour vous aider à resserrer l'approche que vous choisissez.
Notez que je ne suis pas un expert en sécurité.
OAuth / fédéré
Dans cette approche, vous avez un garant tiers où le code consommateur demande le jeton / certificat / ce que vous avez d'eux et vous le transmet, à ce stade, tout ce que vous devez faire est de demander au tiers si la clé qui vous a été donnée est légitime.
Pro:
Con:
Certificats asynchrones
Ici, vos clients chiffreraient leurs communications avec un certificat public que vous avez partagé avec eux lorsqu'ils ont créé un utilisateur. De votre côté, vous décrypteriez en utilisant la clé privée associée à cet utilisateur. Généralement, vous initieriez la communication avec une réponse de défi pour montrer qu'ils peuvent chiffrer / déchiffrer comme vous vous attendez à les identifier comme qui ils prétendent être. Bien que des approches "synchrones" soient possibles qui n'utilisent pas la réponse-défi, elles ont un peu moins de sécurité et des problèmes de synchronisation temporelle qui peuvent les rendre plus délicats.
de Novell (ouais je sais, novell? vraiment?)
Pro:
Con:
NTLM
Ne riez pas, s'il s'agit d'un service plus petit ou interne uniquement et que vous êtes dans un environnement Windows, il n'y a rien de mal à utiliser l'authentification NTLM standard pour garantir l'accès. Surtout si vous travaillez avec IIS, c'est de loin l'approche la plus simple. Facile à entretenir et à configurer également dans un fichier web.config.
Pro:
Con:
Nonces
Lorsque vous travaillez avec des nonces dans votre approche d'authentification, vous fournissez une méthode pour obtenir un nonce sur le service. Cette méthode renvoie une chaîne ou un élément de données arbitraire unique ("un nonce") à chaque demande. Chaque demande à d'autres méthodes nécessite désormais de récupérer un nonce et de l'utiliser dans l'algorithme de chiffrement de la demande. La valeur ici est que le serveur garde une trace des nonces utilisés et ne permet jamais la réutilisation d'un nonce, cela empêche complètement les attaques de relecture car une fois qu'une demande avec un nonce est faite, une demande avec ce nonce ne peut plus être faite à nouveau. Au fur et à mesure que les nonces sont demandés, ils sont ajoutés à une liste des nonces disponibles, lorsqu'ils sont utilisés, ils sont déplacés de la liste disponible vers la liste utilisée.
Pro:
Con:
la source