it-swarm.com.de

Warum können GPUs so gut Passwörter knacken?

Was ist mit GPUs, mit denen sie Passwörter so schnell knacken können?

Es scheint, dass die treibende Kraft hinter der Einführung guter Schlüsselableitungsfunktionen für Kennwörter (bcrpyt, PBKDF2, scrypt) anstelle des gestrigen kryptografischen Hash (MD *, SHA *) darin besteht, dass letztere für Programme anfällig sind, die auf GPUs ausgeführt werden und große Zahlen erraten von Passwörtern extrem schnell. Warum sollten GPUs diese Hash-Funktionen so viel besser bewerten können als CPUs?

33
Nick

Um die Antwort von @ Terry zu vervollständigen: Eine GPU hat viele Kerne (Hunderte). Jeder Kern ist grundsätzlich in der Lage, eine 32-Bit-Arithmetikoperation pro Taktzyklus zu berechnen - als Pipeline . In der Tat funktioniert die GPU gut mit extreme Parallelität: Wenn viele identische Arbeitseinheiten ausgeführt werden müssen, tatsächlich viel mehr als tatsächliche Kerne ("identisch" bedeutet "gleiche Anweisungen", aber nicht "gleiche Daten").

Einige Details für eine etwas alte NVidia-Karte (eine GTX 9800+, ab Anfang 2009): Es gibt 128 Kerne, aufgeteilt in 16 "Multicore-Einheiten". . Jeder Multicore kann 8 Operationen pro Zyklus initiieren (daher die Idee von 128 Kernen: das sind 16 mal 8). Der Multicore verarbeitet Arbeitseinheiten ("Threads") in Gruppen von 32, sodass ein Multicore, wenn er einen Befehl zum Ausführen hat, diesen Befehl tatsächlich über 4 Taktzyklen an seine 8 Kerne ausgibt. Dies ist Operation Initiation: Jede einzelne Operation benötigt bis zu 22 Taktzyklen. Sie können sich den Befehl und seine Operanden als vorrückende Frontlinie vorstellen, wie eine Welle in einem Pool: Eine bestimmte Welle benötigt einige Zeit, um das andere Ende des Pools zu erreichen, aber Sie können mehrere Wellen nacheinander senden.

Sie können also den Rhythmus von "128 32-Bit-Operationen pro Zyklus" nur so lange beibehalten, wie Sie mindestens 22-mal so viele "Threads" ausführen müssen (dh mindestens 22 · 128 = 2816), so dass Threads ausgeführt werden können gruppiert nach Paketen von 32 "identischen" Threads, die zur gleichen Zeit dieselben Anweisungen ausführen, wie Hip-Hop-Tänzer. In der Praxis gibt es einige interne Schwellenwerte und Einschränkungen, die mehr Threads erfordern, um die optimale Bandbreite von bis zu etwa 4096 zu erreichen.

Mit einer SHA-1-Implementierung konnte ich nahezu 99% der optimalen Bandbreite erreichen. SHA-1 verwendet etwas mehr als 1100 32-Bit-Operationen (das wären ungefähr 900 auf einer CPU, aber eine GTX 9800+ hat keinen Rotation Opcode, daher müssen Rotationen in zwei Schichten und a aufgeteilt werden logisch oder), und die GPU lief mit 1450 MHz, was einer Gesamtsumme von ungefähr 160 Millionen SHA-1-Berechnungen pro Sekunde entspricht. Dies kann nur erreicht werden, solange Sie Millionen SHA-1-Instanzen parallel berechnen müssen, wie dies beim Knacken von Passwörtern der Fall ist (Sie benötigen jederzeit 4096 parallele SHA-1-Instanzen, um die zu füttern GPU-Kerne, aber Sie müssen sich auch mit E/A-Kosten für die Eingabe potenzieller Kennwörter befassen. Diese Kosten dominieren, wenn Sie nicht viele SHA-1-Instanzen verarbeiten müssen.

Der Host-PC auf seiner CPU (ein Quad-Core-Intel Core2 mit 2,4 GHz) konnte ungefähr 48 Millionen SHA-1 pro Sekunde erreichen und - that ​​war mit gründlich optimiertem SSE2-Code. Ein einzelner SHA-1 verwendet ungefähr 500 Taktzyklen auf einer solchen CPU (die CPU kann mehrere Befehle in einem einzigen Zyklus berechnen, vorausgesetzt, sie konkurrieren nicht um Ressourcen und sind nicht voneinander abhängig), sondern zum Knacken von Passwörtern Es lohnt sich, SSE2 mit seinen 128-Bit-Registern zu verwenden und 4 Befehle parallel zu berechnen. Mit SSE2-Einschränkungen dauert es ungefähr 800 Taktzyklen, um vier parallele SHA-1 auszuführen, das sind also 200 Taktzyklen pro SHA-1-Instanz. Diese CPU enthält vier Kerne und das Ganze läuft mit 2400 MHz, also 48 Millionen pro Sekunde.

Neuere Hardware wird schneller sein, GPU jedoch mehr. Eine GTX 680 hat 1536 Kerne, und in einer GTX 690 gibt es zwei solche GPUs. Wir sprechen hier von Milliarden SHA-1-Instanzen pro Sekunde.

(Zum Vergleich habe ich auch eine Implementierung von SHA-1 auf dem Cell Processor durchgeführt, dh der CPU in einer PS3-Konsole mit ihren 8 "SPU" -Coprozessoren. Eine SPU war nicht verfügbar. Mit der 7 Bei anderen erreichte ich ungefähr 100 Millionen SHA-1 pro Sekunde, dh besser als eine moderne große PC-CPU, aber nicht so gut wie eine gute GPU aus derselben Zeit.)


Zusammenfassung: Die GPU erzielt eine hervorragende Leistung, indem sie eine starke Parallelität mit Hunderten (wenn nicht Tausenden) von Kernen verwendet. Dies wird ermöglicht durch Pipelining (jeder einzelne Vorgang benötigt viele Zyklen, aber aufeinanderfolgende Vorgänge können wie Lastwagen auf einer Autobahn gestartet werden) und das Teilen von Befehlsdecodierungen (da viele Kerne dieselben Befehle am ausführen) gleiche Zeit).

42
Thomas Pornin

Eine GPU kann hervorragend mathematische Berechnungen verarbeiten. Das Rendern von Grafiken ist einfach eine Reihe komplexer mathematischer Berechnungen. Hashing-Algorithmen auch.

Eine GPU verfügt über Hunderte von Kernen, mit denen mathematische Funktionen parallel berechnet werden können. Eine CPU hat normalerweise 4-8 Kerne. Obwohl ein CPU-Kern viel schneller als ein GPU-Kern ist, ist das Passwort-Hashing eine der Funktionen, die sehr einfach parallel ausgeführt werden können. Dies gibt GPUs einen massiven Vorteil beim Knacken von Passwörtern.

Sie sollten beachten, dass PBKDF2 von den drei genannten Algorithmen auf einer GPU immer noch relativ leicht geknackt werden kann. Der PBKDF2-Algorithmus hascht ein Passwort mit einer Hash-Funktion wie MD5 oder SHA1 tausendfach. Obwohl es viel stärker als ein einfacher MD5- oder SHA1-Hash ist, kann es mit einer GPU dennoch relativ schnell geknackt werden.

bcrypt und scrypt wurden entwickelt, um die massive Beschleunigung der Cracking-Zeit zu vermeiden, die eine GPU einem Angreifer bietet. Weitere Informationen finden Sie in dieser unglaublichen Antwort von Thomas Pornin: https://security.stackexchange.com/a/31846/10211

19
user10211