2010-06-12 7 views
9

Dans le module tornado de .web il y a une fonction appelée _time_independent_equals:Que signifie ce _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 simplement une manière complexe de dire a==b?

Répondre

18

Cette fonction ne compare pas simplement les chaînes, elle essaie toujours de prendre le même temps à s'exécuter.

Ceci est utile pour les tâches de sécurité telles que la comparaison de mots de passe. Si la fonction est retournée sur le premier octet non concordant, un attaquant pourrait essayer tous les premiers octets possibles et savoir que celui qui prend le plus de temps est une correspondance. Ensuite, ils pourraient essayer tous les seconds octets possibles et savoir que celui qui prend le plus de temps est un match. Cela peut être répété jusqu'à ce que toute la chaîne soit déduite. (En réalité, vous devez faire beaucoup de moyenne pour surmonter les retards aléatoires dans le réseau, mais cela fonctionne si vous êtes patient.)