Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Webmaster-Security Fragen zur richtigen Serverkonfiguration oder Absicherung dynamischer Scripte gehören hier hinein.

PHP/SQL - Passwort wirklich sicher speichern

Diskussion: PHP/SQL - Passwort wirklich sicher speichern im Forum Webmaster-Security, in der Kategorie Security Area; Anzeige hoi - aaaalso ich bin der Neue, der euch in nächster zeit wohl öfter in diesem Forum belästigen wird ...

Antwort
Alt 06.01.07, 06:02   #1 (permalink)
 
Registriert seit: 06.01.07
keksinat0r Leistung: Facit NTK
Likes: 0
Question PHP/SQL - Passwort wirklich sicher speichern

Anzeige

hoi - aaaalso ich bin der Neue, der euch in nächster zeit wohl öfter in diesem Forum belästigen wird ;)

und zwar bin ich auf der suche nach einer möglichst sicheren Methode Login-Passwörter zu verschlüsseln.
auf sha1 und md5 allein kann man sich ja nichtmehr verlassen...
mit Bruteforce und diversen Online-Datenbanken sind solche Passwörter schnell geknackt...

jetzt hab ich mir meinen "eigenen" Algorithmus gebaut, der auf Hash-keys und Salt's basiert... das ganze mehrmals hintereinander. So kommt am ende ein 128-Zeichen-Code heraus.

jetzt wollt ich mal fragen wie sicher das wirklich ist, denn bei hash's ist ja immer das Problem dass es mehrere "Lösungen" zu einem Hash gibt...

keksinat0r ist offline   Mit Zitat antworten
Alt 06.01.07, 07:47   #2 (permalink)
 
Registriert seit: 13.09.06
BlackSun1102 Leistung: Facit NTK
Likes: 0
Standard

Hi,

Das verwenden eines eingenen Algorithmuses verschafft dir natürlich einen Vorteil, aber denke an das Kerckhoffs-Prinzip, das besagt, dass eine Verschlüsselung nicht auf Geheimhaltung des Algorithmus basieren darf sondern einzig und allein in der Geheimhaltung des Schlüssels.

Und wer sagt, das dein Algorithmus sicher ist? Ist jetzt nichts gegen dich, aber selbst in Algorithmen wie MD5 und SHA, die von sehr guten Mathematikern entwickelt wurden, wurden Schwachstellen entdeckt. OK, du hättest den Vorteil, dass weniger Leute versuchen Schwachstellen zu finden, da der Algorithmus nicht so weit verbreitet ist (...)

Schau dir doch auch mal diesen Artikel an: Salted Hash

Was im Enddeffekt auch noch Sinn macht, ist ein Teil des Hashs in einer DB zu speichern und den anderen Teil in einer Datei, das hat den Vorteil, das jemand, der z.B. einen Exploit für deinen SQL Server hat erst noch einen für dein Dateisystem suchen muss...

Gruß Chris
BlackSun1102 ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 06.01.07, 07:47   #3 (permalink)
HKA
 
Registriert seit: 15.10.06
HKA Leistung: Facit NTK
Likes: 0
Standard

Eine eigene Verschlüsellungsmethode ist eigentlich sehr sicher, wenn du niemandem sagst wie sie funktioniert.
Das mit den doppelten Hashes ist erstmal kein Problem außer wenn dein Algorithmus zu viele Kollisionen verursacht.

MFG -=HKA
HKA ist offline   Mit Zitat antworten
Alt 06.01.07, 08:13   #4 (permalink)
Themenstarter
 
Registriert seit: 06.01.07
keksinat0r Leistung: Facit NTK
Likes: 0
Standard

das mit splitten des hashkeys ist eine sehr gute idee :]
werd ich sofort einbauen ^^

@blacksun: salted hash's hab ich ja implementiert
keksinat0r ist offline   Mit Zitat antworten
Alt 06.01.07, 09:17   #5 (permalink)
 
Registriert seit: 13.09.06
BlackSun1102 Leistung: Facit NTK
Likes: 0
Standard

Hi,

Du könnstest z.B. die Rundenanzahl für deinen Hash Algorithmus aus dem Benutzernamen berechenen...

Oder du kannst die Hashs nochmal mit AES verschlüsseln und den Key auf einem anderen Server speichern...

Der Paranoia beim Datenschützen sind keine genzen gesetzt

Gruß Chris
BlackSun1102 ist offline   Mit Zitat antworten
Alt 06.01.07, 15:38   #6 (permalink)
LX
Moderator
 
Registriert seit: 14.02.06
LX Leistung: Z3
LX eine Nachricht über ICQ schicken LX eine Nachricht über AIM schicken LX eine Nachricht über Yahoo! schicken
Likes: 21
Lightbulb

Der tollste Hash-Algorithmus bringt nix, wenn der User schwache Passworte auswählt. Die Kombination aus einem Salted Hash mit MD5 und einer Prüfroutine, die keine Passworte akzeptiert, die nicht mindestens 6 Zeichen (mit Buchstaben, mindestens einer Zahl und einem Sonderzeichen) beinhalten, halte ich da aber für sicher genug. MD5 auch deswegen, weil die Kollisionswahrscheinlichkeit hier (im Gegensatz zu einem eigenen Algorithmus nachweislich) sehr gering ist.

Den Salt kannst du ja woanders ablegen oder dynamisch berechnen lassen, in dem Fall würde es nicht mal was bringen, wenn jemand Zugriff auf deine Datenbank bekommt und den Hash auslesen könnte.
__________________
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

JS BB LX UP
LX ist offline   Mit Zitat antworten
Alt 06.01.07, 17:28   #7 (permalink)
 
Registriert seit: 25.07.06
valenterry Leistung: Facit NTK
Likes: 0
Standard

Zwing den Benutzer dazu ein langes Passwort zu verwenden und speicher dann sein Passwort als verschiedene Hashes ab. (MD5, SHA-1 bis 512, Whirlpool, GOST, ...)
Damit wird es so gut wie unmöglich das Passwort rauszufinden.
Bruteforce kannste wegen der Länge knicken und eine Kollision zu finden, die auf mehrere Hashes zutrifft ist sehr gering.
Aber wie gesagt:

Zitat:
Der tollste Hash-Algorithmus bringt nix, wenn der User schwache Passworte auswählt.
valenterry ist offline   Mit Zitat antworten
Alt 06.01.07, 18:03   #8 (permalink)
 
Registriert seit: 13.09.06
BlackSun1102 Leistung: Facit NTK
Likes: 0
Standard

Hi,

Zitat:
Original von valenterry
speicher dann sein Passwort als verschiedene Hashes ab. (MD5, SHA-1 bis 512, Whirlpool, GOST, ...)
Damit wird es so gut wie unmöglich das Passwort rauszufinden.
Bruteforce kannste wegen der Länge knicken und eine Kollision zu finden, die auf mehrere Hashes zutrifft ist sehr gering.
Stimmt, ABER wenn jemand nun einen Exploit hat, mit dem er die Daten seines SQL Servers auslesen kann, kann sich der Cracker raussuchen, welchen Hash er entschlüsseln will.

Gruß Chris
BlackSun1102 ist offline   Mit Zitat antworten
Alt 06.01.07, 18:37   #9 (permalink)
Moderator
 
Benutzerbild von Elderan
 
Registriert seit: 30.03.04
Elderan Leistung: 8086
Likes: 14
Standard

Hallo,
selber einen Hash Algorithmus schreiben, die Runden-Anzahl zu variieren und ähnliche Expertiemente schaden mehr als dass sie nutzen.

Was wirklich hilft, ist eine Salt zu verwenden, z.B. 10 Bytes. Denn dann funktionieren die Datenbanken/Rainbow-Tables nicht mehr und wenn man ein gutes Passwort verwendet (>8 Zeichen), dann dauert es tausende von Jahren bis man das Passwort per Brute Force geknackt hat.

Du kannst z.B. die PHP Funktion crypt(); mit MD5 als Algorithmus verwenden, oder wenn es möglichst kompatibel sein soll, generierst du eine zufällige 8 Byte Salt und in der DB speicherst du dann:
$pw = $Salt.'$'.md5($Salt.$UserPW);

Außerdem solltest auch noch überprüfen, ob das Passwort sicher ist. Denn gegen ein schwaches PW helfen nicht die besten Maßnahmen.


Was evt. auch noch intressant sein könnte, wäre eine HMAC zu verwenden.
Der Angreifer müsste dann Zugriff auf deine DB und Zugriff auf deinen PHP Script mit dem Key bekommen. Eine normale SQL Injection (in älteren phpBB Versionen konnte man per SQL Injection an die Passwort-Hashs gelangen) würde dann nicht mehr reichen.

Optimal wäre es, wenn du auf dem Server ein Programm laufen hast, was dir die HMAC's berechnet, und welches normale User nur ausführen können (inkl. Brute-Force schutz). So müsste ein Angreifer root Rechte auf dem Server bekommen, um an das Programm und somit an den Key zu gelangen.
Aber solch eine Möglichkeit ist eher selten.
Elderan ist offline   Mit Zitat antworten
Alt 10.01.07, 04:10   #10 (permalink)
Themenstarter
 
Registriert seit: 06.01.07
keksinat0r Leistung: Facit NTK
Likes: 0
Standard

hmmm...
Zitat:
Elderan
selber einen Hash Algorithmus schreiben, die Runden-Anzahl zu variieren und ähnliche Expertiemente schaden mehr als dass sie nutzen.
Was wirklich hilft, ist eine Salt zu verwenden, z.B. 10 Bytes. Denn dann funktionieren die Datenbanken/Rainbow-Tables nicht mehr und wenn man ein gutes Passwort verwendet (>8 Zeichen), dann dauert es tausende von Jahren bis man das Passwort per Brute Force geknackt hat.
Salts hab ich ja eingebaut, das Passwort wird vor dem ersten Hashen mit 2 Salts versehn, und danach abhängig von einem variablen Schlüssel in jeder Stufe wieder mit diversen Salts vesehn, wobei das orignale Passwort in Verbindung mit einem Schlüssel mehr Gewichtung in dem einzelnen Hashs bekomt als die Salts, um die Kollisionswahrscheinlichkeit zu minimieren...
Zu erklären wie das bei bis jetzt genau funktioniert ist ja auch erst mal egal^^

Minnimale Passwortlänge hatt ich eigentlich 7 Zeichen mit mindestens einem/einer Sonderzeichen/Ziffer, allerdings nicht am Anfang/ende, vorgesehn um Wörterbuchattacken auszuschalten.
Und Bruteforce wird sich wohl an den diversen variablen Hash's die Zähne ausbeißen...

Algorithmen verwende ich md5, sha1 und zur Berechnung der variablen Hash's crc32.

Zitat:
Elderan
Was evt. auch noch intressant sein könnte, wäre eine HMAC zu verwenden.
Der Angreifer müsste dann Zugriff auf deine DB und Zugriff auf deinen PHP Script mit dem Key bekommen. Eine normale SQL Injection (in älteren phpBB Versionen konnte man per SQL Injection an die Passwort-Hashs gelangen) würde dann nicht mehr reichen.
okay, was genau ist/macht HMAC denn genau? ich hab mir den Artikel mal durchgelesen, aber bin nicht wirklich schlau daraus geworden^^ soweit ich das verstanden hab generiert HMAC einen umkehrbaren Hash aus einer "Nachricht" - sprich Passwort - und einem Schlüssel.
Also ähnlich meinem Algorithmus... nur was genau bringt mir das dann im Endeffekt an Sicherheit?
keksinat0r ist offline   Mit Zitat antworten
Alt 26.01.07, 16:47   #11 (permalink)
Moderator
 
Benutzerbild von Elderan
 
Registriert seit: 30.03.04
Elderan Leistung: 8086
Likes: 14
Standard

Hallo,
Zitat:
Original von keksinat0r
okay, was genau ist/macht HMAC denn genau?
Etwas spät die Antwort ^^

Also HMAC arbeitet so ähnlich wie normale Hashverfahren, allerdings nur die Person die im Besitzt des Schlüssels ist, kann gültige Hashwerte erzeugen, bzw. diese überprüfen.

Wenn du dein PW als MD5 in der DB hinterlegst, und ein Angreifer per SQL Injection an den Hashwert kommt, kann er per BruteForce diesen Hashwert knacken, indem er für jede Zeichenfolge den Hashwert bildet und schaut, ob der gesuchte dabei ist.

Bei HMAC wäre dies nicht mehr möglich, er bräuchte zusätzlich noch den geheimen Schlüssel um überhaupt gültige Hashwerte zu generieren.

In PHP würde eine sichere HMAC Implementierung mit Salt so aussehen:
PHP-Code:
<?php


function HMAC($pw$salt=null)
{
   
//Eine interne Variable damit die nicht auf anderen Seiten ungewollt ausgegeben werden kann
   
$key "geheimer Key";

   if(
$salt == null)
      
$salt substr(base64_encode(pack('H*',crc32(microtime()))),0,6); //6 Zeichen Salt
   
else if(strpos($salt"|") !== false)
       
$salt substr($salt0strpos($salt"|"));

   return 
$salt.'|'.sha1($key.sha1($salt.$pw));
}

//Usage:
//Hash generieren
$hash HMAC("UserPasswort");

//Hash überprüfen
if(HMAC($usereingabe$hash_aus_db) == $hash_aus_db)
   echo 
"Richtiges PW";
?>
Nur wer den Wert für KEY besitzt, ist in der Lage gültige Hashwerte zu generieren.
Für einen Angreifer würde es nicht mehr reichen per SQL Injection an die Hashwerte zu gelangen, er müsste zusätzlich noch eine Lücke im Server finden, um PHP Dateien auszulesen.

Ein weiteres häufiges Problem ist das Datenbank-Backup, worüber ein Angreifer alle Hashwerte bekommen kann.

In einer älteren phpBB Version konnte man durch einfache Cookie Manipulation Adminrechte erlangen. Man musste dazu die Userid von einem Admin kennen (meistens 2) und dann für den PW Hash einen speziellen, manipulierten Wert eintragen und schon konnte man sich mit dem Cookie als Admin einloggen (ohne einen Hashwert zu kennen).
Im AdminCP könnte man sich dann das Datenbank Backup herunterladen und per BruteForce die Passwörter knacken, um damit weiteren Schaden anzurichten.
Mit HMAC hätte man wie gesagt, noch eine Möglichkeit suchen müssen, PHP Scripts auszulesen.
Elderan ist offline   Mit Zitat antworten
Alt 26.01.07, 17:22   #12 (permalink)
Senior Member
 
Registriert seit: 18.09.05
[starfoxx] Leistung: Facit NTK
Likes: 0
Standard

Ich glaube beim letzten if() fehlen die {} - klammern
edit: die fehlen fast überall. kurzschreibweise oder fehler?

Was ich mir überlegt habe, und ich habe keine ahnung davon, was wäre wenn man den MD5 Hash, nochmal durch die md5() laufen lassen würde?

Dann hätte man für den Endhash minimum ein 32-bytiges zeichen, also mit sicherheit lange genug. Darauf müsste man dann erstmal kommen, so als häcker.

also md5("1234") -> [hash] -> md5("[hash]") -> Endpasswort

So als Idee.
[starfoxx] ist offline   Mit Zitat antworten
Alt 26.01.07, 17:53   #13 (permalink)
 
Benutzerbild von Eydeet
 
Registriert seit: 14.04.06
Eydeet Leistung: Facit NTK
Likes: 4
Standard

Die Klammern kann man bei PHP weglassen, dann wird nur der nachfolgende Befehl als zugehörig betrachtet.

Wenn man den Hash 2 mal durch die MD5-Routine laufen lassen würde, brächte das kaum größere Sicherheit. Der Cracker lässt das Passwort, dass er ausprobiert dann einfach auch 2mal durch die Routine laufen. Die Rechenzeiten würden zwar etwas erhöht, aber die MD5-Summe braucht er trotzdem nicht erraten.
Eydeet ist offline   Mit Zitat antworten
Alt 26.01.07, 23:02   #14 (permalink)
404
 
Benutzerbild von 404
 
Registriert seit: 28.11.04
404 Leistung: Z3
404 eine Nachricht über ICQ schicken
Likes: 0
Standard

@Elderan sehr interessant - werde das gleich (in einer leicht abgewandelten Form) in meine Session Class implementieren.

@starfoxx - gegen Bruteforce bringt das wenig, wenn der Angreifer weiß, dass die md5 Funktion 2 mal verwendet wurde. Gegen Rainbowtables hingegen schon


Aber selbst der beste Algoryhtmus bringt wenig, wenn der Benutzer den Namen seiner Freundin oder etwas ähnlich banales als Passwort nutzt

Deshalb immer ne Prüfroutine einbauen, die nur Passwörter ab 8 Zeichen + mindestens 1 Zahl & ein Sonderzeichen zulässt.
__________________
Major Fault, General Error and Colonel Panic came together to celebrate timeout.


------------------------------------------------
http://www.shick.de/
------------------------------------------------
404 ist offline   Mit Zitat antworten
Alt 27.01.07, 01:18   #15 (permalink)
Senior Member
 
Registriert seit: 18.09.05
[starfoxx] Leistung: Facit NTK
Likes: 0
Standard

Ich meinte das, von der Annahme aus gehen dass derjenige nur an den Hash gekommen ist. Wenn man Sql-Injected hat man ja nicht grundsätzlich zugriff auf den PHP Code. Soweit ich das verstanden habe.

Dann brächt's was. irgendwie.
[starfoxx] ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Security Area » Webmaster-Security » PHP/SQL - Passwort wirklich sicher speichern
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Online-Verschlüsselungs-Dienst wirklich sicher? BA Baracus Cryptography & Encryption 4 21.06.07 19:49
PHP/SQL - Passwort wirklich sicher speichern keksinat0r (Web-) Design und webbasierte Sprachen 6 06.01.07 17:28
SafeGuard Easy wirklich sicher? Fred556 (In)security allgemein 2 18.03.04 16:22
www.accessprotect.com wirklich sicher? izak (In)security allgemein 7 27.02.04 11:38
Server wirklich sicher? Gulliver (In)security allgemein 3 16.02.04 18:10


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61