Was bedeutet das `_time_independent_equals` bedeuten?
Frage
In der Tornado .web-Modul gibt es eine Funktion namens _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
Es wird verwendet, sicheres Cookie Signaturen zu vergleichen, und daher der Name.
Aber in Bezug auf die Implementierung dieser Funktion ist es nur eine komplexe Art und Weise a==b
zu sagen?
Lösung
Diese Funktion ist nicht nur die Saiten zu vergleichen, versucht es immer die gleiche Menge an Zeit in Anspruch nehmen auszuführen.
Dies ist nützlich für Sicherheitsaufgaben wie Passwörter zu vergleichen. Wenn die Funktion auf der ersten unpassende Byte zurückgegeben, könnte ein Angreifer versuchen, alle möglichen ersten Bytes und wissen, dass derjenige, der am längsten dauert ein Spiel ist. Dann könnten sie alle möglichen zweiten Bytes versuchen und wissen, dass derjenige, der am längsten dauert ein Spiel ist. Dies kann wiederholt werden, bis der gesamte String abgeleitet wird. (In Wirklichkeit haben Sie eine Menge zu tun mit durchschnittlich zufälligen Verzögerungen im Netzwerk zu überwinden, aber es funktioniert, wenn Sie geduldig sind.)