• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Das neue Jahr beginnt wie das alte - natürlich mit einem neuen Fotowettbewerb! Auch im Monat Januar freuen wir uns auf Eure Einsendungen. Wie es weitergeht, wisst Ihr ja - Hier geht es lang --> Klick

Wie funktioniert BCRYPT?

DubiDuh

Zwiebelapfel
Registriert
20.05.08
Beiträge
1.288
Hallo,

ich habe eine Frage die mich nach diversen Tagen der Recherche nicht beantwortet hat. Vielleicht schafft ihr das ja :) Und zwar: Online-Portale wie LinkedIn und wahrscheinlich auch Apfeltalk hashen die Passwörter ihrer User mit einem Algorithmus. Im Falle von LinkedIn war dies SHA1 bzw. ein SHA-X Algorithmus. Doch diese sind lt. meinen Recherchen zwar schnell, aber nicht zielführend. Denn ein schlauer Mann, dessen Namen ich gerade nicht weiß, sagte einmal "Der Sinn eines Hashings ist nicht die Geschwindigkeit".

Daher kam ich kurz oder lang auf den BCRYPT-Algorithmus bzw. Blowfish. Natürlich habe ich mir diesen sofort mal angeschaut und ein paar Ausgaben erzeugen lassen, aber eins verwunderte mich dann doch: Warum soll das Resultat dieses Algorithmus "besser" im Sinne von langsamer knackbar sein, als SHA?

Bspw: Ich salze natürlich meine Eingaben und lasse sie dann hashen. Es gelte folgendes Beispiel:

Code:
string salt = "fn7wFChGz3FW4cZtuNOYU";
string password = "password123" // Very Secure Password *ironic*
int costs = 10;

Diese Eingaben sind in meinen Programmcode versteckt, sprich: den Salt sollte keiner sehen können, da ich ja kompiliere (vereinfachte Annahme: Dekompilieren geht nicht).

Generiere ich nun mittels SHA1 einen Hash daraus, erhalte ich folgenden String
Code:
ac1a2b467c9e930e23edb6f48e1a3bbc32623733

Alles super, da ich weder den Salt sehe und sonst noch andere Eingaben des obigen Codes.

Lasse ich nun mittels BCRYPT einen Hash erzeugen, erhalte ich folgendes:
Code:
$2a$10$fn7wFChGz3FW4cZtuNOYU.q.kPzICxj4khbTSkoTeEtaPd1XexUhO

Mein Menschenverstand sagt mir jetzt aber: Scheisse! Da ist das gesamte Salz drin UND die Anzahl der Durchläufe des verwendeten Algorithmus. Also muss ich als Hacker nur noch folgendes machen: Ich ziehe mir (wie bei LinkedIn) alle Passwort-Hashes aus der DB, lese für jeden den SALT- und COSTS-Wert aus und fange fröhlich mit meiner Brute-Force oder Rainbow-Attacke an.

Nun fällt mir nur eine Möglichkeit ein: Ich speichere die Hashes in einer Datenbank erst ab der 29. Stelle (bis dahin geht der SALT-Wert und andere Angaben) und setze dann später alles manuell wieder zusammen.

Oder ist die Sicherheit gegenüber dem SHA1-Hash jener, dass man ca. 10000 Hashes/Sekunde bei SHA1 checken lassen kann (als bspw. 10.000 Einträge aus einem Dictionary) und bei BCRYPT je nach COSTS-Wert nur um die 7.7 Hashes/Sekunde?

Ich würde mich über Aufklärung freuen :)
 

DubiDuh

Zwiebelapfel
Registriert
20.05.08
Beiträge
1.288
Die Antwort habe ich mittlerweile gefunden:

Die Sicherheit ergibt sich durch die Geschwindigkeit des jeweiligen Algorithmus. Je höher der COSTS-Wert ist, desto länger braucht der Algorithmus, um einen Hash zu berechnen. Diese Zeit muss also von einem Hacker aufgebracht werden, um für jeden möglichen Ausgangswert (Brute-Force) einen Hash zu erzeugen und diesen mit Ziel-Hash zu vergleichen.

Angenommen der Hacker braucht für das Erzeugen eines SHA-Hashes 0.1 Sekunden und für den von BCRYPT 1.0 Sekunden, dann kann dieser 10-mal so viele Hashes die mit SHA generiert wurden abfragen wie jene, die mit BCRYPT erzeugt werden. Laufzeit entscheidet also zum großen Teil über Sicherheitsaspekte.