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?

War es hilfreich?

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.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top