Python używa losowego ziarna mieszającego, aby uniemożliwić napastnikowi atakowanie aplikacji przez wysyłanie kluczy przeznaczonych do zderzenia. Zobacz original vulnerability disclosure. Przesunięcie wartości mieszania o losowy materiał siewny (ustawione podczas uruchamiania raz) nie może już przewidzieć, jakie klucze będą kolidować.
Możesz ustawić stały materiał siewny lub wyłączyć tę funkcję, ustawiając PYTHONHASHSEED
environment variable; wartością domyślną jest random
, ale można ustawić ją na stałą dodatnią wartość całkowitą, przy czym 0
całkowicie wyłącza tę funkcję.
Wersje w języku Python w wersjach 2.7 i 3.2 mają domyślnie wyłączoną funkcję (użyj przełącznika -R
lub ustaw PYTHONHASHSEED=random
, aby go włączyć); jest on domyślnie włączony w Pythonie 3.3 i wyżej.
Jeśli polegałeś na kolejności klawiszy w słowniku lub zestawie Pythona, nie rób tego. Python używa tabeli mieszania, aby zaimplementować te typy i ich kolejność: depends on the insertion and deletion history, a także losowe ziarno mieszające.
Zobacz także object.__hash__()
special method documentation:
Uwaga: domyślnie wartości __hash__()
STW, bajtów i obiektów datetime są „solone” z nieprzewidywalnym wartości losowej. Mimo że pozostają one stałe w ramach pojedynczego procesu Pythona, nie można ich przewidzieć między powtórnymi wywołaniami Pythona.
Ma to na celu zapewnienie ochrony przed odmową usługi spowodowaną ostrożnie wybranymi danymi wejściowymi, które wykorzystują najgorszy przypadek wykonania wstawienia dyktowanego, złożoność O (n^2). Aby uzyskać szczegółowe informacje, patrz http://www.ocert.org/advisories/ocert-2011-003.html.
Zmiana wartości mieszania wpływa na kolejność iteracji dykt, zestawów i innych mapowań. Python nigdy nie udzielił gwarancji na temat tego zamawiania (zazwyczaj różni się między wersjami 32-bitowymi i 64-bitowymi).
Zobacz także PYTHONHASHSEED
.
Jeśli potrzebujesz stabilnej implementacji skrótu, prawdopodobnie chcesz spojrzeć na hashlib
module; implementuje kryptograficzne funkcje skrótu. The pybloom project uses this approach.
Ponieważ przesunięcie składa się z przedrostka i sufiksu (odpowiednio wartość początkowa i końcowa XOR), nie można po prostu zapisać przesunięcia. Z drugiej strony oznacza to, że atakujący nie mogą łatwo określić przesunięcia z atakami taktowania.
To jest funkcja zabezpieczająca. –
Tagged [tag: hash-collision], [tag: security], [tag: python-3.3] – smci