Domanda

Nel tornado .web modulo v'è una funzione denominata _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

E 'usato per confrontare le firme cookie sicuro, e quindi il nome.

Ma per quanto riguarda l'implementazione di questa funzione, è solo un modo di dire complesso a==b?

È stato utile?

Soluzione

Questa funzione non si limita a confrontare le stringhe, si cerca di prendere sempre la stessa quantità di tempo per l'esecuzione.

Questo è utile per compiti di sicurezza come paragonare le password. Se la funzione restituito il primo byte mismatching, un utente malintenzionato può tentare tutte le possibili primi byte e sapere che quello che prende più lungo è una corrispondenza. Poi si potrebbe provare tutte le possibili secondo byte e sapere che quello che prende più lungo è una corrispondenza. Questa operazione può essere ripetuta fino a quando si deduce l'intera stringa. (In realtà quello che devi fare un sacco di media per superare ritardi casuali della rete, ma funziona se si ha pazienza.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top