Question

J'essaie d'analyser et de valider un jeton JWT dans node.js basé sur cet exemple (créé en .NET): https://github.com/liveservices/LiveSDK/blob/master/Samples/Asp.net/AuthenticationTokenSample/JsonWebToken.cs

Voici mon node js javascript qui valide le token:

var validateSignature = function(key, claims, envelope, signature) {
    var hasher = crypto.createHash('sha256');
    hasher.update(key + "JWTSig");
    var key = hasher.digest('binary');
    var hmac = crypto.createHmac('sha256', key);
    hmac.update(envelope + '.' + claims);
    var out = hmac.digest('base64');
    console.log(out);
    console.log(signature);
    console.log(out === signature);
}

Maintenant, ce qui est très étrange, c'est que ça marche presque.Voici la sortie des trois instructions console.log:

pEwNPJ+LUHBdvNx631UzdyVhPFUOvFY8jG3x/cP81FE=
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
false

Il me semble suspect que les hachages soient les mêmes sauf pour le + - / _=

Quelqu'un a repéré mon erreur?Quelque chose à voir avec mon encodage base64.

<₹UPDATE

J'ai joué un peu plus et il semble y avoir quelque chose de génial avec l'encodage base64 ici.Le code suivant dans le nœud js:

console.log(signature);
var b = new Buffer(signature, 'base64');
console.log(b.toString('base64'));

donne:

pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
pEwNPJLUHBdvNx631UzdyVhPFUOvFY8jG3xcP81F

Ce qui semble très étrange, non?

Était-ce utile?

La solution

Merci à Timothy Meade pour ses commentaires et m'avoir poussé dans la bonne direction.

Le type de tampon de nœud génère la norme Base64 avec +, / et=

Il existe un encodage en base64 sécurisé pour les URL, comme mentionné ici: http://en.wikipedia.org/wiki/ Base64

Il remplace + par -, / par _ et= est facultatif.Le jeton qui est transmis à la QueryString (d'uh) est une version sécurisée pour les URL.D'où la différence.

Le code a été corrigé par un simple:

out = out.replace('+','-').replace('/','_').replace('=','');

Autres conseils

J'ai écrit cette bibliothèque il y a quelque temps, je suppose que vous pouvez utiliser une partie du code.Il est censé fonctionner à la fois dans node.js et dans un navigateur moderne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top