Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Frage zu Password-Hashes (SHA512) (https://www.delphipraxis.net/184062-frage-zu-password-hashes-sha512.html)

Codehunter 23. Feb 2015 10:42

Frage zu Password-Hashes (SHA512)
 
Hallo!

Bezieht sich eigentlich auf PHP, ist aber von allgemeiner Bedeutung, darum frag ich mal hier.

Da man ja MD5 nicht mehr verwenden soll, hashe ich Passwörter jetzt mit SHA512. Der String 'foo' plus Salt ergibt dann bei 5000 Runden z.B. folgenden Hash:
Code:
$6$rounds=5000$7IfaSuwiHawucad7$CiVrIv5dy15xaeiInz/IN2jRx82pqYU4yKy.lUtBeExzwsSRGPy8fjQiSN8lsjUjcIm08GzxSjJ.mj2z4qrN7/
Der Modus 6 (SHA512) und die 5000 Runden sind hardcoded.

Die Frage die ich mir stelle ist: Wenn der Modus 6 und die 5000 Runden ohnehin bekannt sind, sollte ich dann nicht lieber nur den eigentlichen Hash, also alles nach dem dritten "$" in der Datenbank speichern und später wieder hinzufügen beim Auswerten? Sonst gibt man doch im Fall eines Datenklaus unnötig Hinweise auf die Verschlüsselungsmethode. Oder mach ich jetzt einen Denkfehler?

Grüße
Cody

Sir Rufo 23. Feb 2015 10:49

AW: Frage zu Password-Hashes (SHA512)
 
Irgendwo muss es ja bekannt sein und wenn es nicht in der Datenbank steht (was wurde benutzt) dann hast du ein Problem, wenn du das (was wird benutzt) änderst. Welches habe ich benutzt um diesen Hash zu erzeugen.

Das aktuelle (was wird benutzt) ist auch hinterlegt (im Skript, einer Config, ...) ... und damit auch potenziell gefährdet.

Ob du es nun in der Datenbank speicherst und damit auch wechseln kannst oder nicht bleibt vom Risiko also gleich.

Codehunter 23. Feb 2015 14:52

AW: Frage zu Password-Hashes (SHA512)
 
Zitat:

Zitat von Sir Rufo (Beitrag 1291077)
Ob du es nun in der Datenbank speicherst und damit auch wechseln kannst oder nicht bleibt vom Risiko also gleich.

Prinzipiell stimme ich dir zu. Nur meiner Erfahrung nach sind die PHP-Scripte doch ein Stück weit sicherer als die Daten in einer Datenbank. Zumindest wenn man ein paar Grundregeln der Webserver-Konfiguration beachtet.

mjustin 23. Feb 2015 15:18

AW: Frage zu Password-Hashes (SHA512)
 
Zitat:

Zitat von Codehunter (Beitrag 1291076)
Code:
$6$rounds=5000$7IfaSuwiHawucad7$CiVrIv5dy15xaeiInz/IN2jRx82pqYU4yKy.lUtBeExzwsSRGPy8fjQiSN8lsjUjcIm08GzxSjJ.mj2z4qrN7/

Fehlt in diesem String nicht das Salz? Der Salt-Wert soll ja zusammen mit dem entstandenen Hashwert in der Datenbank gespeichert werden (https://de.wikipedia.org/wiki/Salt_%28Kryptologie%29)

himitsu 23. Feb 2015 15:30

AW: Frage zu Password-Hashes (SHA512)
 
Was ist rounds=5000 ?

Heißt es, daß das Passwort 5000 Mal hintereinander eingerechnet wurde?

Bei 512 Bit, reichen knapp 80 Buchstaben (mit effektiven 6 Bit pro Buchstabe) doch schon aus, um einen sicheren eindeutigen Wert zu bekommen, denn mehr Informationen passen eh nicht rein. :gruebel:

BUG 23. Feb 2015 17:38

AW: Frage zu Password-Hashes (SHA512)
 
Erst einmal: Das Salt sollte für jeden Hash unterschiedlich sein. Damit vermeidet man, dass ein Angreifer bei einer Wörterbuch-Attacke jedes Wort nur einmal Hashen muss und dann gegen die Datenbank vergleichen kann.

@himi: Die Runden erhöhen den Zeitaufwand des Angreifers.

Außerdem solltest du keine normale Hashfunktion verwenden, sondern eine Key-Derivation-Funktion wie bcrypt oder scrypt. Gründe findest du durch googeln genug :wink:

Wenn du dann mit einem zusätzlichem geheimen Salt oder einer zusätzlichen Verschlüsselung besser schlafen kannst, dann will ich dich nicht abhalten.

Namenloser 23. Feb 2015 20:00

AW: Frage zu Password-Hashes (SHA512)
 
Ich denke, es ist in Ordnung, diese Informationen dort im Klartext stehen zu haben. In der Kryptographie geht man ja eigentlich immer davon aus, dass der Angreifer den Algorithmus kennt.

Was ich allerdings dennoch nicht schlecht finde, ist zwei verschiedene Salts zu kombinieren: Einen individuellen per Datensatz, der in der Datenbank gespeichert wird, und einen globalen, der irgendwo im Quelltext steht. Dann muss der Angreifer beide Systeme kompromittieren (oder mehr rechnen).

Codehunter 25. Feb 2015 15:27

AW: Frage zu Password-Hashes (SHA512)
 
Zitat:

Zitat von mjustin (Beitrag 1291136)
Fehlt in diesem String nicht das Salz? Der Salt-Wert soll ja zusammen mit dem entstandenen Hashwert in der Datenbank gespeichert werden (https://de.wikipedia.org/wiki/Salt_%28Kryptologie%29)

Ähm, nein, ist enthalten: $6$rounds=5000$7IfaSuwiHawucad7$CiVrIv5dy15xaeiInz/IN2jRx82pqYU4yKy.lUtBeExzwsSRGPy8fjQiSN8lsjUjcIm08 GzxSjJ.mj2z4qrN7/
Zitat:

Zitat von BUG (Beitrag 1291165)
Erst einmal: Das Salt sollte für jeden Hash unterschiedlich sein.

Danke für den Hinweis, hab ich entsprechend angepasst.
Zitat:

Zitat von Namenloser (Beitrag 1291176)
Was ich allerdings dennoch nicht schlecht finde, ist zwei verschiedene Salts zu kombinieren

Das würde allerdings nur gehen wenn ich mit der ganzen Hash-Prozedur zwei Durchläufe mache und den "User-Hash" im "System-Hash" unterbringe oder umgekehrt.

Namenloser 25. Feb 2015 15:38

AW: Frage zu Password-Hashes (SHA512)
 
Zitat:

Zitat von Codehunter (Beitrag 1291504)
Zitat:

Zitat von Namenloser (Beitrag 1291176)
Was ich allerdings dennoch nicht schlecht finde, ist zwei verschiedene Salts zu kombinieren

Das würde allerdings nur gehen wenn ich mit der ganzen Hash-Prozedur zwei Durchläufe mache und den "User-Hash" im "System-Hash" unterbringe oder umgekehrt.

Versteh ich nicht ganz. Statt
Delphi-Quellcode:
hash(salt+password)
machst du einfach
Delphi-Quellcode:
hash(salt1+salt2+password)
.

Codehunter 26. Feb 2015 10:45

AW: Frage zu Password-Hashes (SHA512)
 
Zitat:

Zitat von Namenloser (Beitrag 1291507)
Versteh ich nicht ganz. Statt
Delphi-Quellcode:
hash(salt+password)
machst du einfach
Delphi-Quellcode:
hash(salt1+salt2+password)
.

Das hat mit der Gegenprüfung zu tun. Wie gesagt, es dreht sich eigentlich um PHP und dort um die Funktion crypt().
Code:
//Verschlüsseln bzw. Hashen
$hash = crypt($plaintext_to_hash, $config_str_with_salt);

/Gegenprüfung
if ($hash == crypt($plaintext_to_check, $hash) {...}
Bei deiner Methode stünden wieder beide Salts im Klartext in der SQL-Datenbank, was du ja grade nicht wolltest. Denn der Hash muss den (Zufalls-)Salt enthalten, sonst wüsste das System beim späteren Vergleich ja nicht, welcher das war. Wenn einer der beiden Salts geheim sein soll, müsste man ihn vorher schon mal zum Hashen verwenden und das Ergebnis nochmal mit dem "öffentlichen" Salt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz