Qu'est-ce que cela signifie `_time_independent_equals`?
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
?
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.)