Che cosa significa questo `_time_independent_equals` significa?
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
?
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.)