Alt 05.12.2011, 12:18:24   #1 (permalink)
Xot
-

ID: 413078
Lose-Remote

Reg: 26.11.2006
Beiträge: 442
Xot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekannt
Standard Login Script, Sicherheit verbessern

Hallo zusammen,

ich bastle für meine Seite gerade ein Login Script und mir kam da eine Idee:
Und zwar werden die POST Daten im Klartext übermittelt solange kein HTTPS zur Verfügung steht.

Meine Idee war jetzt das Passwort schon mit JS verschlüssle und dann nur noch den Hash übermittle. Als FallBack Lösung würde ich dann trotzdem das Passwort unverschlüsselt verschicken, wenn kein JS aktiv ist.

Macht dieser zusätzliche Aufwand Sinn?
Xot ist offline   Mit Zitat antworten
Gesponsorte Links
Alt 05.12.2011, 12:42:49   #2 (permalink)
Erfahrener Benutzer

ID: 272843
Lose-Remote

Reg: 01.02.2007
Beiträge: 1.814
marac genießt hohes Ansehenmarac genießt hohes Ansehenmarac genießt hohes Ansehenmarac genießt hohes Ansehenmarac genießt hohes Ansehenmarac genießt hohes Ansehenmarac genießt hohes Ansehenmarac genießt hohes Ansehenmarac genießt hohes Ansehenmarac genießt hohes Ansehenmarac genießt hohes Ansehen
Standard

Die Frage ist ja, was hast du an zusätzlicher Sicherheit davon?

Ob du jetzt "passwort" an den Server schickst, und der dir den Zugriff erlaubt, oder du schickst "7a62b45e0972fad91" und der Server erlaubt dir den Zugriff, ist ja erstmal egal.

Wer den übertragenen Schlüssel mitliest, kann genau diesen wieder zum Server schicken und sich damit anmelden.

Der Vorteil wäre höchstens, dass du den User schützt, der dasselbe Passwort an verschiedenen Stellen verwendet, da an anderen Stellen eben nicht "7a62b45e0972fad91" sondern der Klartext des Passworts zum Login erwartet wird.

Eine zusätzliche Sicherheit für deine eigene Seite würdest du aber höchstens erreichen, wenn die clientseitige Verschlüsselung in irgendeiner Form dynamisch erfolgt. Zum Beispiel indem du die Session-ID und/oder Quell-IP oder auch einen beim Aufruf der Login-Seite mitgeschickten SALT mit reinverschlüsselst. Wenn dann jemand den Schlüssel mitliest, kann er sich damit erstmal nicht unbedingt anmelden, weil dann ja der Schlüssel nicht mit den sonstigen Client-Daten, die mit der Abfrage übergeben werden, zusammenpasst.
Und nun gebe ich ab zur Werbung:
marac ist offline   Mit Zitat antworten
Alt 05.12.2011, 12:48:04   #3 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Zitat:
Zitat von Xot Beitrag anzeigen
Meine Idee war jetzt das Passwort schon mit JS verschlüssle und dann nur noch den Hash übermittle.
Was heißt da "nur noch"? Ich gehe mal davon aus, dass du heute schon nur (gesalzenene) Hashs in der DB speicherst. Möchte sich jemand einloggen und übermittelt er das PW, wird auf dem Server im gleichen Verfahren der Hash ermittelt und mit dem gespeicherten Hash verglichen.

Wenn du nun den Hash schon beim Client erstellen lässt, würdest du ja dein komplettes Versalzungsverfahren preisgeben, was ein deutlicher Rückschritt in der Sicherheit wäre.

Daher muss der Server weiterhin selbst die Hashs erstellen und prüfen. Deine eigentliche Frage ist ja aber, wie man das eingebene PW möglichst sicher zum Server bekommt. Und hierfür könntest du natürlich ein JS-Verschlüsselungsverfahren nutzen (wobei ich da keine Tipps habe), das sollte aber absolut nichts mit der bisherigen Klartextmethode zu tun haben und es reicht dann natürlich nicht nur einen Hash zu übertragen, sondern eben die entstehende verschlüsselte Zeichenkette.


Heute schon gepixelt
joschilein ist offline   Mit Zitat antworten
Alt 05.12.2011, 13:17:48   #4 (permalink)
Xot
-

ID: 413078
Lose-Remote

Reg: 26.11.2006
Beiträge: 442
Xot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekannt
Standard

Zitat:
Zitat von marac Beitrag anzeigen
Der Vorteil wäre höchstens, dass du den User schützt, der dasselbe Passwort an verschiedenen Stellen verwendet, da an anderen Stellen eben nicht "7a62b45e0972fad91" sondern der Klartext des Passworts zum Login erwartet wird.
Genau dies will ich erreichen. Somit hat der Angreifer "nur" Zutritt zu meiner Seite und nicht direkt das Passwort des Users.

Zitat:
Zitat von joschilein Beitrag anzeigen
Wenn du nun den Hash schon beim Client erstellen lässt, würdest du ja dein komplettes Versalzungsverfahren preisgeben, was ein deutlicher Rückschritt in der Sicherheit wäre.
Das ist ein guter Punkt welchen ich noch gar nicht bedacht habe. Also bist du der Meinung, dass das Passwort lieber in Klartext übertragen werden sollte um das Salt-Verfahren zu schützen?
Xot ist offline Threadstarter   Mit Zitat antworten
Alt 05.12.2011, 13:30:20   #5 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Nein, ich habe nur gesagt, dass das Verfahren für die PW-Hashs komplett auf dem Server bleiben soll.

Zusätzlich dazu kannst du ein versalzenes Verschlüsselungsverfahren für den Client bereit stellen. Dieser verschlüsselt (bestenfalls kommt bei jedem Aufruf trotz gleicher PW-Eingabe ein anderer Crypttext raus), sendet diesen an den Server, dieser entschlüsselt und macht ab da alles genau so als ob ein unverschlüsseltes Passwort eingegangen wäre (hashen, vergleichen, usw).


Heute schon gepixelt
joschilein ist offline   Mit Zitat antworten
Alt 05.12.2011, 13:46:53   #6 (permalink)
Xot
-

ID: 413078
Lose-Remote

Reg: 26.11.2006
Beiträge: 442
Xot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekannt
Standard

Zitat:
Zitat von joschilein Beitrag anzeigen
Dieser verschlüsselt (bestenfalls kommt bei jedem Aufruf trotz gleicher PW-Eingabe ein anderer Crypttext raus), sendet diesen an den Server, dieser entschlüsselt und macht ab da alles genau so als ob ein unverschlüsseltes Passwort eingegangen wäre (hashen, vergleichen, usw).
Da das ganze aber dann Clientseitig implementiert wird, kann der Angreifer das ganze mit entsprechenden Kenntnissen entschlüsseln. In wie weit sich der Aufwand dann lohnt ist fragwürdig. Daher hatte ich Anfangs an den Hash gedacht (Wobei ich den Salt völlig vernachlässigt habe ).

Oder meinst du folgendes Szenario:
SHA1 vom PW Clientseitig -> Serverseitig dem Hash noch einen Salt hinzufügen und wieder SHA1 -> Das mit der DB abgleichen

Nur irgendwie habe ich in Erinnerung, dass man ein Passwort nicht doppelt hashen soll... Finde dazu aber gerade keine interessanten Links.
Xot ist offline Threadstarter   Mit Zitat antworten
Alt 05.12.2011, 14:29:14   #7 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Ich gehe mal davon aus, dass du etwas in der Art bereits implementiert hast:
1. Eine Funktion, die aus einem Passwort ein Hash macht:
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
class User{
// ...
function MakeHash($pw$salt2 NULL){  
  
$salt1 'ABC';
  
$salt3 '123';
  
$hash md5($salt1.$pw.$salt2.$salt3);
  return 
$hash;
}
// ...

Und momentan wird beim Login eben so geprüft:
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
$pw    $_POST['passwort'];
$user  $_POST['benutzername'];
$hash  User::MakeHash($pw);
$uhash User::GetUserhash($user); // Fragt DB
if ($hash === $uhash){
  
// PW korrekt
} else {
  
// PW nicht korrekt

Du könntest die obere Zeile 3 auch erweitern mit
PHP-Code:
1:
2:
$salt  User::GetUsersalt($user); // Fragt DB, könnte z.B. eine eMail sein.
$hash  User::MakeHash($pw$salt); 
Wie oft ein PW gesalzen wird ist eigentlich völlig egal. Wichtig ist nur, dass das Verfahren immer gleich ist. Sollte es mal gewechselt werden (und dazu zählt auch eine Änderung der Salts), müsste noch erkennbar sein, auf welchem Verfahren welcher Hash basiert, um so nach und nach alte Hashs durch neue zu ersetzen. Aber das ist ein ganz anderes Thema.

Wenn nun also JS das Passwort verschlüsselt, sieht das für den Server so aus:
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
$crypt $_POST['crypt']; // verschlüsselt
$user  $_POST['benutzername'];
// ***

$pw Crypt::decode($crypt); // entschlüsselt

// Ab hier alles wie gehabt..

$hash  User::MakeHash($pw);
$uhash User::GetUserhash($user); // Fragt DB
if ($hash === $uhash){
  
// PW korrekt
} else {
  
// PW nicht korrekt

Und jetzt kommt es eben drauf an, wie du deine Crypt-Klasse gestaltest. Du schickst bei der Formularerstellung beispielsweise einen öffentlichen Schlüssel mit, JS verschlüsselt das dann, schickt das Ergebnis im POST und ein Angreifer kann auch unter Kenntnis des öffentlichen Schlüssels nicht ohne weiteres das übertragene Passwort lesen. Der zugehörige private Schlüssel bleibt auf dem Server. Du kannst auch wahlweise mehrere Schlüsselpaare verwenden, dann muss im POST einfach nur noch ein Feld mit einer Schlüssel-ID rein.


Heute schon gepixelt
joschilein ist offline   Mit Zitat antworten
Alt 05.12.2011, 15:00:00   #8 (permalink)
return void
Benutzerbild von ice-breaker

ID: 93995
Lose-Remote

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.026
ice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehen
Standard

öffentlicher und privater Schlüssel, wie von joschilein beschrieben, ist die einzige sichere Variante, und oh Wunder, so funktioniert SSL.
Ein Problem gibt es dabei aber: Es gibt keine sicheren RSA-Implementierung in JavaScript die zu OpenSSL kompatibel ist. Man findet nur 1:1 Implementierungen des Algorithmus wie von Rivest, Shamir und dem dritten anno sonstwas beschrieben. Aber der Algorithmus in seiner Reinform ist noch nicht sicher, dazu benötigt es noch PKCS#1. Und das wird dann von 90% der JS-Implementierungen nicht implementiert oder es ist inkompatibel zu anderen Implementierungen.
Und dann kommt noch hinzu, dass heutzutage noch nicht alle JavaScript-Implementierungen von Browsern wirklich schnell sind (IE), bei dem wirklich berechnungskomplexen RSA also wirklich ein Problem, es seiden man verwendet lächerliche 128Bit bei der Verschlüsselung


Was spricht denn so gegen SSL? Wer Sicherheit möchte wird doch wohl die 15€/Jahr für ein SSL-Zertifikat ausgeben können


"Die Wahrheit entgeht dem, der nicht mit beiden Augen sieht." -Orici
ice-breaker ist offline   Mit Zitat antworten
Alt 05.12.2011, 16:01:44   #9 (permalink)
Xot
-

ID: 413078
Lose-Remote

Reg: 26.11.2006
Beiträge: 442
Xot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekanntXot ist jedem bekannt
Standard

Zitat:
Zitat von ice-breaker Beitrag anzeigen
Was spricht denn so gegen SSL? Wer Sicherheit möchte wird doch wohl die 15€/Jahr für ein SSL-Zertifikat ausgeben können
Da das ganze Script nicht für mich gedacht ist, kann ich diese Entscheidung leider nicht treffen

Würde denn etwas gegen diese Lösung sprechen?
  1. SHA Clientseitig generieren
  2. Diesem SHA dann den Salt hinzufügen und wieder hashen
  3. Dies dann mit der DB abgleichen

Somit würde das PW wenigstens nicht im Klartext übertragen.
Xot ist offline Threadstarter   Mit Zitat antworten
Alt 05.12.2011, 16:11:52   #10 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Zitat:
Zitat von Xot Beitrag anzeigen
  1. SHA Clientseitig generieren
  2. Diesem SHA dann den Salt hinzufügen und wieder hashen
  3. Dies dann mit der DB abgleichen
Wenn wir uns richtig verstehen, sind die Punkte 2 und 3 meine oben beschrieben standardmäßigen Verfahren zum "PW-Hash in DB speichern".

Aber was bringt dir Punkt 1? Gegen was möchtest du dich bzw. den Besucher schützen? Wer den Datenverkehr zwischen Client und Server abfängt, der erfährt als Quasi-Client auch das clientseitige Verfahren und kann so mit relativ geringem Aufwand auch aus dem als PW-Ersatz übermittelten Hash das ursprünglich eingegebene Passwort des Angegriffenen ermitteln. Ja, es ist mehr Aufwand als 0, aber eine einzige Rainbow-Table zu erstellen ist heutzutage auch nicht mehr so wahnsinnig aufwändig. Wer das eine kann (Daten abfangen), kann i.d.R. auch das andere (Rainbow-Table).


Heute schon gepixelt
joschilein ist offline   Mit Zitat antworten
Alt 05.12.2011, 17:31:48   #11 (permalink)
return void
Benutzerbild von ice-breaker

ID: 93995
Lose-Remote

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.026
ice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehen
Standard

Zitat:
Zitat von Xot Beitrag anzeigen
Da das ganze Script nicht für mich gedacht ist, kann ich diese Entscheidung leider nicht treffen
dann sagst du einfach es geht nicht, Punkt. SSL wurde genau dafür erschaffen und da haben sich sehr kluge Leute viele Gedanken darüber gemacht und in mehreren Revisionen auch wieder neue Angriffe unbrauchbar gemacht.

Die einzige halbwegs sinnvolle Möglichkeit ist eben der private und public Key, scheitert aber an den JS-Librarys und der Rechenperformance in JavaScript. Diese SHA-Lösung ist genauso einfach zu knacken. Dann wird das Pw eben nicht im Originaltext übertragen sondern durch einen Hash, mache ich eben eine Bruteforce-Attacke. Wenn ich mir schon soviel Aufwand gemacht habe den Traffic abzufangen, ist ein Bruteforce-Angriff das kleinste Problem, zumal moderne Grafikkarten mittlerweile 5.6 Mrd Hashs pro Sekunde berechnen können.


"Die Wahrheit entgeht dem, der nicht mit beiden Augen sieht." -Orici
ice-breaker ist offline   Mit Zitat antworten
Alt 09.12.2011, 09:55:01   #12 (permalink)
Erfahrener Benutzer

ID: 129556
Lose-Remote

Reg: 28.02.2010
Beiträge: 439
tobomator tobomator tobomator tobomator tobomator tobomator
Standard

zum Thema SSL und Sicherheit werfe ich mal folgendes ein:

http://www.heise.de/security/meldung...r-1388835.html

http://www.heise.de/security/meldung...r-1372279.html

...

Solange man hier keine Sicherheit schafft, wer garantiert dann die Sicherheit für SSL ? ...
tobomator ist offline   Mit Zitat antworten
Alt 09.12.2011, 11:51:29   #13 (permalink)
return void
Benutzerbild von ice-breaker

ID: 93995
Lose-Remote

ice-breaker eine Nachricht über ICQ schicken
Reg: 27.04.2006
Beiträge: 6.026
ice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehenice-breaker genießt hohes Ansehen
Standard

Es ist ja auch so alltagsüblich, dass CAs gehackt werden und dann auch noch "falsche" Zertifikate für kleine Mini-Seiten ausgestellt werden ...

Wer garantiert, dass RSA sicher ist? Das ist das viel größere Problem, denn die Sicherheit von RSA kann nicht bewiesen werden, es wird nur vermutet, dass die zu Grunde liegende Primfaktorzerlegung eines Angriffs auf RSA nicht effizient lösbar ist.


"Die Wahrheit entgeht dem, der nicht mit beiden Augen sieht." -Orici
ice-breaker ist offline   Mit Zitat antworten
Alt 09.12.2011, 13:08:44   #14 (permalink)
Erfahrener Benutzer

ID: 129556
Lose-Remote

Reg: 28.02.2010
Beiträge: 439
tobomator tobomator tobomator tobomator tobomator tobomator
Standard

das hab ich nie behauptet, nur zum thema sicherheit bei SSL

Nachtrag:
http://www.heise.de/security/meldung...t-1359373.html

Also wie esmit der allgemeinen Sicherheit steht, scheint wohl klar zu sein.
Was RSA anbelangt, wird es die Zukunft zeigen, wieviele parallele Operationen in der Sekunde laufen können.

Geändert von tobomator (09.12.2011 um 20:36:39 Uhr)
tobomator ist offline   Mit Zitat antworten
Antwort

Gesponsorte Links

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
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 an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
php script: login, einladungssystem wnm222 Scripts & Software 1 03.04.2007 13:48:17
[PHP] Login Script Anachronist Programmierung 14 06.03.2007 19:00:28
Login-Prozess verbessern bei Lose-Remote Dounme Verbesserungsvorschläge 1 14.10.2006 10:54:44
[s] login-script Ufisch Scripts & Software 4 27.05.2006 14:36:17
[S] Login-Script Moe Lose4Scripts (erledigt) 3 24.05.2006 18:04:34


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55:36 Uhr.