[NoSQL] Große PW-Hash Liste in DB übertragen?

Mat

Well-Known Member
c-b Experte
#1
War mir nicht sicher, ob das hier her oder eher in Algorithmen gehört:

Habe mir eine geordnete PW-Hash Liste von https://haveibeenpwned.com/Passwords runtergeladen (500mio Einträge, 30GB, SHA1 Hash + PW-Häufigkeit.. wobei ich die Häufigkeitsinfo nicht brauche). Ich wollte diese Liste nun für verschiedene Dinge verwenden. Da es "geleakte" Passwörter sind, wollte ich eine Liste meiner alten Passwörter damit abgleichen, um zu sehen, ob ich betroffen bin und wann das ungefähr passiert ist (hab Versionsverwaltung bei meinen PWs).

Hab das mit Powershell über direkten Dateizugriff einmal durchlaufen lassen.. hat ewig gedauert aber wurde irgendwann fertig. Für eine einmalige Anwendung ohne Zeitdruck war das für mich ausreichend.

Nun wollte ich damit vielleicht auch mehr machen :
  1. Abfragen, ob ein PW-Hash in der Liste existiert
    • Meine gammelige Powershell-Implementierung nutzt derzeit nicht den Vorteil der geordneten Liste, sondern geht die Datei an einem Stück Zeile für Zeile durch, was ja nicht gerade sinnvoll ist.
    • Mit einem Index oder Index-Gruppen würde das viel schneller gehen.
    • Bei sowas glänzen ja Datenbanksysteme.
  2. Passwort als Klartext beim jeweiligen Hash hinterlegen
    • Mit Hilfe von Rainbow Tables könnte ich Hashes in Klartextpasswörter umzuwandeln und dann beim jeweiligen Hash hinterlegen.
    • Dafür müsste ich für jeden der 500mio Einträge jeweils einen Eintrag in den SHA1 Rainbow Tables suchen und bei einem Treffer das Klartext-PW bei mir hinterlegen.
    • Die Daten könnte man dann analysieren oder einfach nur damit rumspielen.
    • Brauche dafür nur Hash + Klartext, also würde sich eine KeyValue-Datenbank anbieten.
    • Mein PC ist etwas älter und ich hab nur 16GB RAM, deswegen wäre bei einer DB wohl ein Mix aus InMemory und VirtualMemory das Richtige.
Hat jemand mal was ähnliches gemacht?

Anforderungen:
  • 16GB RAM insgesamt muss reichen (verfügbar vielleicht 8-10 GB)
  • HDD Speicher unbegrenzt, SSD Speicher max. 300GB
  • Datensatz = ID (SHA1-Hash) und Wert (Klartext-String)
  • Nur lokal verfügbar, Server und Client auf gleicher Maschine
  • Nur 1 Client, aber gerne mehrere gleichzeitige Verbindungen
  • Hohe Geschwindigkeit beim Abfragen Datensätzen (<1s)
  • Möglicherweise relativ hoher Datendurchsatz für erstmaliges Anlegen der Daten notwendig (>400 Datensätze/s)
  • Anzahl Einträge: ca. 500mio
  • Einträge, die Klartextwerte haben, müssen nie wieder verändert werden, also keine Versionsverwaltung von Einträgen, Snapshots usw. notwendig

Vielleicht fällt euch ja ein Tipp zu den folgenden Punkten ein:
  1. Welches DBMS nehme ich?
    • Ich dachte an Redis, aber bin mir nicht sicher, ob das bei 16GB RAM dann nicht rumspackt.
  2. Wie teile ich die Daten auf?
    • Alles in eine DB hauen und das System verwaltet das schon selbst?
    • Oder aufteilen (z. B. als Hashgruppe bei der alle Hashes drin sind, die mit 1234 anfangen)?
    • Vielleicht sogar 1 Server pro Hashgruppe, der dann nur bei Bedarf gestartet wird?
  3. Wie bereite ich die Daten vor?
    • In meiner DB sollen am Ende alle 500mio Einträge aus der Textdatei stehen
    • Hinter jedem Eintrag, der in den Rainbow Tables gefunden werden kann, soll das entsprechende Klartext-PW gesetzt werden
    • Jeder Eintrag, der sich nicht in den Rainbow Tables finden lässt, soll einen leeren String als Wert haben
    • Soll ich vor dem Import die Daten mit Parsern vorbereiten? Also zum Beispiel eine Kopie der Rainbow Table erstellen, in der alle Einträge gelöscht sind, die nicht in der Textdatei sind und dann zusätzlich die Einträge anhängen, für die es kein PW gibt
    • Oder ist es schneller, die leeren Datensätze anzulegen (erstmal leerer String im PW) und dann bei laufender DB nach und nach die PWs ergänzen zu lassen?
  4. Wie speise ich die Daten ein?
    • Benutze ich einen Client, der die Datei parst und dann die Einträge einzeln an den Server schickt (z. B. mittels vieler asynchroner Schreibvorgänge)?
    • Wandle ich die Datensätze in eine Datei um, die vom Server direkt importiert werden kann (wie zum Beispiel bei SQL-Dateien) ?

Ist nur so ein Hobbyprojekt, das ich nebenbei mache. Geht mir mehr darum, zu wissen, wie ich es machen würde, als es tatsächlich zum Laufen zu bekommen. Über Anhaltspunkte würde ich mich freuen.
 
Oben