Question

Dans le tornade .web module, est une fonction appelée _time_independent_equals:

def _time_independent_equals(a, b):
    if len(a) != len(b):
        return False
    result = 0
    for x, y in zip(a, b):
        result |= ord(x) ^ ord(y)
    return result == 0

Il est utilisé pour comparer les signatures des cookies sécurisés, et donc le nom.

Mais en ce qui concerne la mise en œuvre de cette fonction, est-ce juste une façon de dire complexe a==b?

Était-ce utile?

La solution

Cette fonction ne se compare pas seulement les cordes, il essaie de toujours prendre la même quantité de temps à exécuter.

Ceci est utile pour des tâches de sécurité comme la comparaison des mots de passe. Si la fonction est revenu sur le premier octet de désadaptation, un attaquant pourrait essayer tous les possibles premiers octets et savoir que celui qui prend le plus long est un match. Ensuite, ils pourraient essayer tous les deuxièmes octets possibles et savoir que celui qui prend le plus long est un match. Cela peut être répété jusqu'à ce que la chaîne entière est déduite. (En réalité, vous devez faire beaucoup de calcul des moyennes pour surmonter les retards aléatoires dans le réseau, mais il fonctionne si vous êtes patient.)

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