Automatisierte Suche nach Integer-Hash-Funktionen
(github.com/skeeto)Hash Function Prospector
Dieses Tool ist ein kleines Werkzeug zur automatisierten Suche nach Integer-Hash-Funktionen. Es wählt zufällig aus neun invertierbaren Operationen aus und erzeugt dadurch Milliarden von Integer-Hash-Funktionen. Die generierten Funktionen werden JIT-kompiliert, und deren Avalanche-Verhalten wird bewertet. Die aktuell beste Funktion wird in C-Syntax ausgegeben.
- Avalanche-Score: die Anzahl der Ausgabebits, die im Durchschnitt stabil bleiben, wenn ein einzelnes Eingabebit invertiert wird. Ein niedrigerer Score ist besser. Idealerweise ist der Score 0. Das heißt, wenn ein einzelnes Eingabebit invertiert wird, werden alle Ausgabebits mit 50 % Wahrscheinlichkeit invertiert.
- Prospector kann 32-Bit- und 64-Bit-Integer-Hash-Funktionen erzeugen. Alle Optionen sind in der Hilfe (
-h) beschrieben. Aufgrund des JIT-Compilers werden nur x86-64 unterstützt, die gefundenen Funktionen lassen sich aber überall einsetzen.
Gefundene Hash-Funktionen
Prospector und die dort verfügbaren Hilfsprogramme haben zwei nützliche Klassen von Hash-Funktionen entdeckt. Beide verwenden eine xorshift-multiply-xorshift-Struktur, unterscheiden sich aber in der Rundenzahl.
2-Runden-Funktionen
TheIronBorn hat eine kombinatorische Optimierung verwendet, um die besten bekannten Parameter für diese Struktur zu finden.
- Diese 32-Bit-2-Runden-Permutation hat insbesondere einen besonders geringen Bias und schlägt den bekannten MurmurHash3-32-Bit-Finalizer mit kleinem Vorsprung.
- Die Struktur der Hash-Funktion wurde von Prospector entdeckt, die Parameter wurden mit Hill Climbing und genetischen Algorithmen abgestimmt.
Es gibt weitere 2-Runden-Konstanten mit niedrigerem Bias; einige davon sind besser als lowbias32.
3-Runden-Funktionen
Fügt man in dieser Struktur eine weitere multiply-xorshift-Runde hinzu, kann man bei sorgfältig gewählten Parametern die theoretische Bias-Grenze erreichen. Beispielsweise ist diese Hash-Funktion nicht von einer perfekten PRF zu unterscheiden.
triple32behebt nicht nur das Problemhash(0) = 0, sondern reduziert auch den Bias weiter.- Es gibt weitere 3-Runden-Konstanten mit niedrigerem Bias.
Exakte Bias-Bewertung
Der -E-Modus bewertet den Bias der angegebenen Hash-Funktion (-p oder -l). Standardmäßig nutzt Prospector eine Schätzung, um den Bias der Funktion schnell zu bewerten; diese ist jedoch nicht deterministisch und enthält viel Rauschen. Für eine exakte und erschöpfende Messung des Bias verwenden Sie bitte die Option -e.
- Mit
-pund einem Pattern oder mit einer Shared Library, die eine Funktionhash()enthält, sowie mit-l, können Sie die zu prüfende Funktion festlegen. - Für eine präzise, erschöpfende Prüfung von 64-Bit-Hashes gibt es keinen Test, da dieser zu lange dauern würde.
Auswahl invertierbarer Operationen
Verwendet werden folgende invertierbare Operationen:
x = ~x;x ^= constant;x *= constant | 1;(nur ungerade Konstanten)x += constant;x ^= x >> constant;x ^= x << constant;x += x << constant;x -= x << constant;x <<<= constant;(Linksrotation)x = bswap(x)(Austausch von High- und Low-Byte)
Technisch gesehen ist x = ~x durch x ^= constant abgedeckt. Dennoch ist ~x als Sonderfall einzigartig und besonders nützlich.
16-Bit-Hashes
Für 16-Bit-Hashes gibt es aufgrund abweichender Randbedingungen ein separates Tool namens hp16.
- Anders als beim 32-/64-Bit-Prospector ist diese Implementierung vollständig portabel und läuft auf fast jedem System.
- Die Erstellung und Bewertung von 128 KiB-S-boxen ist ebenfalls möglich.
- Da 16-Bit-Hashes auf Maschinen ohne schnellen Multiplikationsbefehl besonders nützlich sein könnten, kann während der Suche auf bestimmte Operationen verzichtet werden (
-m,-r).
Einige interessante Ergebnisse:
- 2-Runden-xorshift-multiply-Hash
- 3-Runden-xorshift-multiply-Hash
- Multiplikationsfreie Hashes (nur xorshift-add)
Eine gute 3-Runden-xorshift-Hashfunktion (kurze Suche mit hp16 -Xn3) kommt einer guten S-box (hp16 -S) nahe.
Bei 16-Bit-Operationen sollte man die Integer-Promotion-Regeln von C beachten. Das im Programm ausgegebene C-Programm achtet darauf, 16-Bit-Operationen bei Bedarf auf unsigned int zu promoten.
GN⁺-Kommentar
-
Die Sicherheit von Hash-Funktionen spielt sowohl in der Kryptografie als auch in der Computersicherheit eine große Rolle, daher könnte ein solches Suchwerkzeug der Forschung sehr hilfreich sein. Besonders interessant ist, dass es durch zufällige Explorationen Hash-Funktionen mit niedrigem Bias findet.
-
Allerdings ist die Sicherheit einer Hash-Funktion nicht allein durch statistische Eigenschaften garantiert. Kryptografische Hash-Funktionen müssen außerdem gegen Pre-image-, second pre-image- und Kollisionangriffe robust sein, sodass dafür weitere Analysen nötig sind.
-
16-Bit-Hash-Funktionen dürften in eingeschränkten Umgebungen wie IoT- oder Embedded-Systemen nützlich sein. Beeindruckend ist es, dass auf CPUs ohne Multiplikationsbefehl Hashes allein mit ADD/XOR/SHIFT möglich sind.
-
Die Anwendung heuristischer Suchverfahren wie Hill Climbing oder genetischer Algorithmen bei der Hash-Entwicklung ist ebenfalls eine frische Idee. Da KI-Technik zunehmend in die Kryptografie einfließt, könnten solche Optimierungstechniken künftig eine noch wichtigere Rolle spielen.
-
Dennoch ist es wegen der Grenzen von Hash-Funktionen nicht möglich, gute Avalanche-Eigenschaften automatisch als kryptografische Sicherheit zu interpretieren; das ist offenbar eine Grenze dieses Projekts. Dennoch kann dieses Tool dabei helfen, bestehende Hash-Funktionen zu analysieren und zu verbessern.
1 Kommentare
Hacker-News-Kommentar
multiply-shift-xor-Operation lange zuverlässig funktioniert hat.1brcin Go umgesetzt zu haben