2015-10-30 1 views
1

Je ne faisais que m'intéresser à la mise en place de l'extension de signature cryptographique pour l'express qui permet la création de cookies signés.Pourquoi cookie-signature dans nodejs/express compare-t-il des signatures en utilisant sha1-hashing?

Le mac dans la fonction de signature est calculée comme décrit ici:

  1. créer une instance de SHA256
  2. hachage de la valeur de données
  3. créer un base64 codé digérer
  4. supprimer les caractères égaux de fuite ('=')

Le résultat est une concaténation de la valeur d'origine et du mac calculé.

Lors de la vérification de la signature, la valeur est à nouveau signée. Mais pas les signatures sont testées sur l'égalité, mais les chaînes globales consistant de la valeur initiale et le Mac en annexe sont comparés:

return sha1(mac) == sha1(val) ? str : false; 

Ici « mac » contient la valeur originale concaténé avec un mac fraîchement calculé, « val "contient la chaîne d'entrée telle que passée à la méthode de vérification (constituée de la valeur d'origine concaténée avec un ancien mac) et" str "est la valeur signée elle-même.

Voir: https://github.com/tj/node-cookie-signature/blob/master/index.js

Je me serais attendu à ce que seraient comparés que les macs. Mais ce n'est pas le cas. Pourquoi les auteurs ont-ils choisi cette manière de mettre en œuvre la vérification? Quelle est la raison pour ça? Et surtout: Pourquoi ne comparent-ils pas char par char mais un hachage de sha1?

Répondre

1

fonction de sign La mise en oeuvre retourne le concaténé avec '.' et HMAC de la valeur convertie en base 64 sans fuite « = » valeur(le cas échéant).

fonction de unsign La mise en œuvre fait la même chose avec la valeur partie de l'entrée donnée (jusqu'à la '.') et vérifie si l'toute entrée est égale à la sortie de la fonction sign. En comparant les valeurs de hachage I, les auteurs essayaient de repousser timing attack, un attaquant observant le temps qu'il fallait pour vérifier l'égalité caractère par caractère et déterminer par minute les changements entre deux essais à quel caractère le contrôle Échec, et ensuite essayer de deviner caractère par caractère la valeur MAC pour la partie arbitraire valeur. En comparant à l'aide de sha1 digest code prend temps constant en fonction uniquement de la donnée donnée entière longueur d'entrée.

Une remarque plus intéressante est la suppression du remplissage '=' des MAC codées en Base64, je ne sais pas pourquoi feraient-ils comme il y a URL safe variant de Base64.

+0

Cela l'explique. C'est un détail important auquel je n'ai pas pensé. Merci beaucoup pour votre réponse! –

+0

C'est la raison pour laquelle ils ont choisi de comparer les hachages, mais pourquoi n'ont-ils pas choisi de faire une comparaison des signatures en temps constant, ce qui serait beaucoup plus rapide que de générer deux hachages SHA1? 160 bits, tandis que les signatures SHA256 sont de 256 bits (les deux sont cryptographiquement aléatoires)? –