Token : pourquoi générer un hash ?

Le problème exposé dans ce sujet a été résolu.

Salut !

Il y a un truc que je ne pige pas avec le token qu’on donne à un utilisateur ayant réussit à s’authentifier avec un login et un password et qui souhaite utiliser les fonctions d’une API REST par exemple. Concrètement tant que l’utilisateur peut envoyer par HTTP ce token à l’API, celle-ci lui permet d’être utilisée et sinon, elle lui dit de se reconnecter, puis elle lui renvoie si succès un nouveau token, que l’utilisateur pourra alors lui représenter s’il veut utiliser à nouveau une de ses fonctions.

Mais du coup pourquoi aurait-on besoin du token (qui est quand même une hash) + sa quantité de temps d’expiration + sa date de création + sa date de dernière utilisation, alors qu’on pourrait le remplacer par uniquement : une quantité de temps d’expiration et une date de création + une date de dernière utilisation ?

Merci d’avance et bonne aprèm, joyeux Noël ;) .

+0 -0

Comment tu fais pour différencier deux utilisateurs qui se sont connectés en même temps ?

+1 -0

Trop simple à deviner. ;)

Imagine, si je sais que c’est juste le login, j’attends que tu te connectes.
Donc, je sais que tu es connecté alors je sais que la combinaison :

Durée de validité, date de création, durée de dernière utilisation, login

Permet d’envoyer des requêtes en me faisant passer pour login. Sachant que parfois ces informations ne sont pas du tout privées (par exemple sur ZdS). Et qu’on peut facilement les deviné (en tout cas bien plus simplement qu’un hash).

+3 -0

Mais du coup pourquoi aurait-on besoin du token (qui est quand même une hash) + sa quantité de temps d’expiration + sa date de création + sa date de dernière utilisation, alors qu’on pourrait le remplacer par uniquement : une quantité de temps d’expiration et une date de création + une date de dernière utilisation ?

Le token n’est pas valide indéfiniment, notamment pour des raisons de sécurité. Il faut donc trouver un moyen de le limiter dans le temps en y encodant directement les informations qui permettent de le refuser s’il est périmé.

Mais alors comment s’assurer que le client n’a pas bidouillé lui-même les informations en question afin de pouvoir utiliser le token au-delà de la date prévue ? Le serveur qui délivre le token doit le signer et pour cela il peut utiliser un hash : HASH([infos (en clair)] + clef secrète) = SIGNATURE.

Le client présente donc au serveur les infos, et les infos sont jugées valides car le serveur peut vérifier la signature : pour cela, il suffit de calculer HASH([infos (en clair)] + clef secrète) et de voir si ça correspond bien à la signature que le client donne.

Cela répond donc à la question : alors qu’on pourrait le remplacer par uniquement : une quantité de temps d’expiration et une date de création + une date de dernière utilisation ?
Dans un cas stateless, ce ne serait pas suffisant car le serveur n’a aucun moyen de s’assurer que les infos d’expiration sont authentiques. Le seul moyen de le prouver, c’est d’avoir une signature que seul le serveur est capable de générer, et un hash peut servir à cela.

Pour se passer du besoin de signature, on pourrait aussi délivrer des tokens (qui ne sont pas signés) ayant la forme d’une simple séquence aléatoire (au format UUID4 par exemple) et le serveur se chargerait de vérifier dans une base de données si le token est toujours valide (non périmé, non révoqué) et s’il est associé au bon utilisateur.

Le token avec signature a l’avantage de ne pas avoir besoin de vérifier en BDD à chaque requête, car il peut refourguer les infos aux client qui les lui rendra à chaque requête. Ce principe est la base d’une technique qu’on appelle JWT, assez en vogue pour les API.

Et si a la place du hash c’est le login?

Il est quand même plus sûr d’utiliser un token (avec ou sans signature). Si tu as une fuite du token, tu le révoques et tu en refais un nouveau. Si tu as une fuite du couple utilisateur/mdp, ça devient plus compliqué.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte