Python utilizza un seme di hash casuale per impedire agli attaccanti di tar-pitting dell'applicazione inviando chiavi progettate per scontrarsi. Vedi lo original vulnerability disclosure. Sfogliando l'hash con un seme casuale (impostato una volta all'avvio), gli attaccanti non possono più prevedere quali tasti entreranno in collisione.
È possibile impostare un seme fisso o disabilitare la funzione impostando PYTHONHASHSEED
environment variable; il valore predefinito è random
ma è possibile impostarlo su un valore intero positivo fisso, con 0
disattivando del tutto la funzione.
Le versioni Python 2.7 e 3.2 sono disabilitate per impostazione predefinita (utilizzare lo switch -R
o impostare PYTHONHASHSEED=random
per abilitarlo); è abilitato di default in Python 3.3 e versioni successive.
Se si stava facendo affidamento sull'ordine delle chiavi in un dizionario Python o in un set, non farlo. Python usa una tabella hash per implementare questi tipi e il loro ordine depends on the insertion and deletion history così come i semi hash casuali.
vedi anche la object.__hash__()
special method documentation:
Nota: Per default, i valori di __hash__()
str, byte e oggetti datetime vengono “salati” con un valore casuale imprevedibile. Sebbene rimangano costanti all'interno di un singolo processo Python, non sono prevedibili tra invocazioni ripetute di Python.
Questo ha lo scopo di fornire protezione contro un denial-of-service causato da input scelti con cura che sfruttano le peggiori prestazioni di un inserimento dict, complessità O (n^2). Vedere http://www.ocert.org/advisories/ocert-2011-003.html per i dettagli.
La modifica dei valori hash influisce sull'ordine di ripetizione di dicts, set e altri mapping. Python non ha mai fornito garanzie su questo ordine (e varia tipicamente tra i build a 32 e 64 bit).
Vedere anche PYTHONHASHSEED
.
Se è necessaria un'implementazione di hash stabile, probabilmente si desidera esaminare hashlib
module; questo implementa le funzioni hash crittografiche. Il pybloom project uses this approach.
Poiché l'offset è costituito da un prefisso e un suffisso (valore iniziale e valore XORed finale, rispettivamente) non è possibile archiviare l'offset, sfortunatamente. Per quanto riguarda i lati positivi, ciò significa che gli attaccanti non possono facilmente determinare l'offset con gli attacchi temporali.
fonte
2014-12-17 09:52:11
Questa è una funzione di sicurezza. –
Contrassegnato [tag: collisione hash], [tag: sicurezza], [tag: python-3.3] – smci