Frage:
Techniken, um eine Anmeldeseite ohne Verwendung von SSL sicher zu machen
user3535688
2014-11-29 18:44:52 UTC
view on stackexchange narkive permalink

Ich entwickle eine Webseite, auf der Leute Dinge schreiben und kommentieren können (keine persönlichen Informationen erforderlich), und ich muss ein Anmeldeformular einfügen, damit Benutzer alle ihre Aktionen auf meiner Webseite sehen können. Meine Idee ist es, ein Anmeldeformular ohne SSL zu programmieren und es den Leuten zu ermöglichen, sich bei Facebook anzumelden, wenn sie dies bevorzugen. Die Seite wird nur dann vollständig geladen, wenn JavaScript aktiviert ist.

  1. Mein erstes Problem besteht darin, sicherzustellen, dass niemand die Benutzeranmeldeinformationen stehlen kann, indem er sich wie ein Mann in der Mitte verhält. Ich dachte daran, es mit einem ersten Hashing auf der Clientseite mit JavaScript und dann auf der Serverseite zu lösen, wenn ich Hash-Werte erhalte (falls jemand JavaScript löscht), ein zweites Hashing und diese Hash-Werte in der Benutzerdatenbank zu speichern. Ist es ein sicherer Weg, es zu implementieren? Gibt es auch Chancen, dass einige Daten verloren gehen? Wenn ja, wie kann ich feststellen, ob die empfangenen Daten nicht gefährdet sind?

  2. Vor Wörterbuch- und Brute-Force-Angriffen schützen. Ich würde es lösen, indem ich die Anzahl der fehlgeschlagenen Anmeldeversuche zähle, die diesem Benutzerkonto zugeordnet sind. Wenn es mehr als 8-10 in der Reihe ist, zeige ich bei jeder nächsten Anmeldung ein CAPTCHA und implementiere auch eine Zeitverzögerung zwischen aufeinanderfolgenden Anmeldeversuchen . Ich denke, auf diese Weise werden IP-Änderungen kein Problem sein, da ich die Anzahl der fehlgeschlagenen Anmeldungen auf der Serverseite zähle (ich würde eine Benutzervariable in PHP festlegen).

  3. Das Anmeldeformular. Ich habe es auf diese Weise implementiert (ohne das Hashing für jetzt):

    <input id = "Benutzername" name = "Benutzername" placeholder = "Benutzername" type = "text" ><input id = "Passwort "name =" pass "placeholder =" Password "type =" password ">

    Wenn das Formular jedoch über die URL gesendet wird, kann ich das Passwort wie folgt lesen: /LogIn.php?userName = user&pass = pass Wie kann ich das Passwort ausblenden?

  4. ol>

    Was könnten andere gute Ratschläge sein, um so viel Sicherheit wie möglich ohne SSL zu erreichen?

Ein Login zu stehlen ist das Mindeste, was sie tun können. MiTM bedeutet, dass sie fast alles tun können - die an Ihren Server gesendeten Daten ersetzen, die von Ihrem Server kommenden Daten ersetzen ... Wenn Sie das Facebook-Login irgendwie verlieren, werden sich die Leute wahrscheinlich sehr über Sie ärgern. Für Ihre Nummer 3 senden Sie wahrscheinlich Dinge als "GET" -Anforderung anstelle einer "POST" -Anforderung (was Sie aus genau diesem Grund nicht tun sollten).
davide - warum willst du nicht SSL / TLS verwenden? Dies kann uns helfen zu verstehen, wonach Sie suchen, da TLS genau das ist, was Sie basierend auf dem bisherigen Kontext Ihrer Frage verwenden sollten.
Aus Ihren Antworten geht hervor, dass TLS / SSL ein Muss ist. Gibt es gute und nicht so teure oder sogar bessere kostenlose Webhosting-Dienste, die SSL / TLS anbieten?
http://startssl.org/ bietet kostenlose SSL-Basiszertifikate an.
Sie scheinen zu versuchen, sich vor der Reaktion des Benutzers auf Ihren Server zu schützen, der durchgesickert oder geändert wurde, aber Sie haben nichts unternommen, um sich vor den Daten zu schützen, die * von * Ihrem Server * an * den zu ändernden Benutzer gesendet wurden. Wenn eine böswillige Person die Möglichkeit hat, die Seite zu ändern (auch für einen Benutzer), kann sie die Seite ändern, um das Hash-Passwort an Ihren Server zu senden, * und auch * das nicht gehashte Passwort an den Server des Angreifers senden. Es spielt keine Rolle, wie gut Ihre Hash-Funktion ist, wenn der Angreifer das Passwort bereits kennt.
Bitte beachten Sie, dass Sie bei kostenlosen SSL-Diensten wie StartSSL häufig bezahlen müssen, wenn Sie Ihr Zertifikat widerrufen müssen, beispielsweise im Fall von HeartBleed.
Es könnte also sinnvoll sein zu sagen, dass diese Frage mit der Frage "Techniken für das Fahren im ganzen Land ohne Auto" vergleichbar ist. Wo eine Antwort sein könnte "benutze einen Traktor"
Sieben antworten:
DTK
2014-11-29 19:39:00 UTC
view on stackexchange narkive permalink

Warum weigern Sie sich, TLS zu verwenden? Es funktioniert, es hat eine gute Erfolgsbilanz (abgesehen von einigen kleinen Ausnahmen). Die Weigerung, gute Werkzeuge ohne zwingenden Grund zu verwenden, schafft kein Vertrauen und deutet nicht sofort auf Professionalität hin.

Rollen Sie außerdem kein eigenes Authentifizierungssystem. Das ist albern und du wirst Fehler machen. Da Sie erwarten, dass Ihre Benutzer über ein Facebook-Konto verfügen, verwenden Sie stattdessen OAuth2, um die Verbundidentität und -authentifizierung zu nutzen. Noch besser ist es, dies an einen Verbunddienst auszulagern, der es beherrscht und sogar Code-Schnipsel bereitstellt ( https://oauth.io/ fällt mir ein).

Mach dir das Leben nicht schwer.

Wenn das OP seinem Chef ein Argument für die Bezahlung eines Zertifikats vorlegen muss, sollte er klarstellen, dass der Versuch, ein eigenes Zertifikat zu erstellen, insgesamt ** mehr kostet ** als nur ein Zertifikat zu kaufen und es einzurichten. (Das gilt sowohl für die Zeit als auch für das Risiko.)
@jpmc26 Das ist sehr gut ausgedrückt
@jpmc26 Wie hoch sind die Kosten für die Implementierung und Einrichtung eines Web of Trust-Protokolls und die Unterstützung Ihres Systems durch das Betriebssystem? 1 Billion Dollar?
@Aron Ich denke, es reicht aus, "mehr als das Projektbudget des OP" zu sagen.
Ich denke, es hängt davon ab, was genau mit "Rolling Your Own" gemeint ist.In Ruby on Rails / Phoenix (Elixir) -Communitys scheint es durchaus üblich zu sein, benutzerdefinierte Authentifizierungslösungen zu erstellen, die auf vertrauenswürdigen Kryptobibliotheken wie BCrypt basieren, anstatt Authentifizierungsbibliotheken von Drittanbietern zu verwenden, die möglicherweise zu aufgebläht / restriktiv sind.
goodguys_activate
2014-11-29 18:55:39 UTC
view on stackexchange narkive permalink

SSL / TLS-Zertifikate sind ab dem zweiten Quartal 2015 kostenlos. Das Zertifikat erhalten Sie hier:

https://letsencrypt.org/

Verschlüsseln wir bietet domänenvalidierte Zertifikate an, die über IdenTrust kostenlos signiert wurden.

Wenn dies live geht, sollten diese Fragen geschlossen werden, IMHO

Können Sie jetzt bitte den Preis für SSL / TLS hinzufügen?
Dies ist nicht der erste Dienst, der kostenlose TLS-Basiszertifikate anbietet. Es gibt zum Beispiel [StartSSL] (https://www.startssl.com/?app=39), das seit einiger Zeit kostenlose Zertifikate anbietet.
Außerdem ist "geht live" nicht dasselbe wie "wird von der überwiegenden Mehrheit der installierten iser-Agenten erkannt".
@HagenvonEitzen [Dieser Tweet] (https://twitter.com/letsencrypt/status/535473089929154560) könnte Sie interessieren.
@makerofthings7: Ich glaube nicht, dass Client-Programme https://letsencrypt.org fest codieren. Es wäre also nutzlos.
@user2284570 Lesen Sie den Tweet user10008, der über Ihrem Kommentar verlinkt ist.
Das Problem besteht jedoch in den Grenzkosten für ein Upgrade von Nur-HTTP-Hosting auf HTTPS-Hosting sowie in der Anpassung von Clients in SNI-ignoranten Browsern (hauptsächlich Internet Explorer unter Windows XP und Android 2.x).
@tepples: Alle diese Behörden für kostenlose Zertifikate sind für Einzelpersonen. Wenn Sie einen kommerziellen Dienst betreiben und / oder ernsthafte Dinge wie domänenübergreifende Maßnahmen ergreifen müssen, müssen Sie ein Zertifikat kaufen.
@tepples AFAIK Die [Acme-Spezifikation] (https://github.com/letsencrypt/acme-spec/blob/master/draft-barnes-acme.txt) ermöglicht Zertifikate mit mehreren DNS-Namen: Jeder Schlüssel kann für mehrere Domänen autorisiert werden und jeder CSR kann mehrere Domänen enthalten.
user10211
2014-11-29 18:47:08 UTC
view on stackexchange narkive permalink

Was könnten andere gute Ratschläge sein, um so viel Sicherheit wie möglich zu erreichen, ohne SSL zu verwenden?

Sie können TLS verwenden, anstatt etwas Dummes zu tun.

-1 TLS ist die neue Version von SSL. Menschen meinen TLS normalerweise mit "SSL".
+1 @kinokijuf - Ich bin sicher, Terry weiß das. Der Punkt ist: Verwenden Sie eine der vorhandenen Technologien, anstatt zu versuchen, Ihre eigenen zu rollen.
Yogu
2014-11-30 19:19:20 UTC
view on stackexchange narkive permalink

Was Sie versuchen, ist ohne eine sichere Methode zum Senden Ihrer Dateien an den Client, z. B. TLS, nicht möglich. Ihre Ansätze zum clientseitigen Hashing des Kennworts erfordern, dass das Javascript sicher an den Client gesendet wird. Andernfalls könnte ein MITM einfach ein Skript bereitstellen, das nicht das Kennwort hasht, sondern stattdessen das Klartextkennwort direkt an sie sendet.

Der wichtige Teil ist, dass Sie vertrauenswürdiger Code auf dem Client . Bei TLS ist dieser vertrauenswürdige Code der Browser, der wiederum die Integrität Ihres Javascript überprüft, um es ebenfalls vertrauenswürdig zu machen. Ohne sich auf das oder etwas Äquivalentes zu verlassen (von dem ich nichts weiß), können Sie keine Annahmen darüber treffen, was auf dem Computer des Clients ausgeführt wird.

Um dies zu verhindern, muss TLS im Wesentlichen neu erfunden werden.
@Mark Mein Punkt ist, dass es * unmöglich * ist, TLS oder ähnliches im Javascript Ihrer Webseite neu zu erfinden.
@Yogu würde ich nicht als unmöglich bezeichnen, aber es wäre sehr kostspielig, es richtig zu machen, und es würde mit ziemlicher Sicherheit Jahre dauern, bis Fehler behoben sind, bevor es fast richtig war. Da SSL / TLS / IPSec nicht weit verbreitet wäre, hätte es außerdem nicht die Kontrolle, Fehler für ihn zu finden.
@DTK: Wenn nicht unmöglich, wie würden Sie sicherstellen, dass der von Ihnen geschriebene Code tatsächlich auf dem Client-Computer ausgeführt wird, wenn dem Transport der Skripte nicht vertraut werden kann?
@Yogu Zu diesem Zeitpunkt haben Sie den Verteilungsteil der Frage zur digitalen Lieferkette und liefern eine Lösung an die Endpunkte über einen vertrauenswürdigen Mechanismus. Da die TLS-Implementierung mit dem Browser geliefert wird, können Sie der TLS-Implementierung vertrauen, wenn Sie dem Kanal vertrauen, der den Browser empfängt. Ich sage nicht, dass dies eine gute Position ist. Kurz gesagt, erfinden Sie TLS nicht neu und suchen Sie nach einer guten Möglichkeit, es zu verbreiten.
Ich bin mir nicht sicher, ob ich den Unterschied zwischen der Verschlüsselung auf der Transportschicht und einer anderen Schicht verstehe. Es gibt nichts Besonderes an "Transport-Layer" -Sicherheit AFAICT.
@Mehrdad: Entschuldigung für die Verwirrung, ich meinte nicht TLS speziell. Es ist wichtig, dass der * Transport * der Skripte sicher ist, damit Sie wissen, dass sie unverändert beim Client angekommen sind.
@Yogu: Ich habe auch nicht speziell TLS gemeint, deshalb habe ich * "Transport-Layer" -Sicherheit * anstelle von * TLS * geschrieben. Meine Frage steht noch.
@Mehrdad Ich habe den Teil * Transportschicht-Sicherheit * bearbeitet. Ich meinte nicht die OSI * Transportschicht *, das war also verwirrend.
Buge
2014-12-01 03:09:26 UTC
view on stackexchange narkive permalink

Die einzige Möglichkeit, ohne TLS sicher zu sein, ist ein Browser-Plugin, das über TLS heruntergeladen werden muss. Ein Browser-Plugin ist ein großer Nachteil für die Benutzerfreundlichkeit.

Der Grund dafür ist, dass auf dem Computer des Benutzers vertrauenswürdiger Code vorhanden sein muss. Dies kann entweder der TLS-Code im Browser des Benutzers oder der Plugin-Code sein.

user2813274
2014-11-29 22:05:34 UTC
view on stackexchange narkive permalink

Die anderen Antworten sind klar - verwenden Sie jedoch SSL

, um darauf hinzuweisen, was fehlschlagen würde, wenn Sie es wie beschrieben implementieren würden:

Ich dachte daran, es mit a zu lösen Erstes Hashing auf der Clientseite mit JavaScript und dann auf der Serverseite, wenn ich Hash-Werte erhalte (falls jemand JavaScript löscht), ein zweites Hashing und Speichern dieser Hash-Werte in der Benutzerdatenbank. Ist es ein sicherer Weg, es zu implementieren? Gibt es auch Chancen, dass einige Daten verloren gehen? Wenn ja, wie kann ich feststellen, ob die empfangenen Daten nicht kompromittiert wurden?

In diesem Szenario würde ein MITM den vom Client gesendeten Hash empfangen - wenn dies eine Anmeldung oder ähnliches wäre. Sie könnten es kopieren und dann senden, wann immer sie sich als X anmelden möchten. Chance, dass Daten verloren gehen? Mit einem MITM ist grundsätzlich garantiert, dass einige Daten verloren gehen können - die Frage ist, ob Sie sie erkennen können. Woher wissen Sie, dass die empfangenen Daten nicht kompromittiert werden? Der typische Weg wäre, sie zu signieren.

Wenn Sie SSL wirklich nicht verwenden dürfen, können Sie sie sicher über WS Security abrufen Stattdessen, aber seien Sie gewarnt, dies wird komplizierter als nur SSL.

Schützen Sie sich vor Wörterbuch- und Brute-Force-Angriffen.

Im Allgemeinen können sie wie beschrieben besiegt werden, jedoch zu den Zeiten, in denen Sie sich wirklich um Brute-Force sorgen müssen Angriffe sind Offline-Angriffe. In diesem Fall wird Ihr Code nicht ausgeführt und kann die Daten nicht durch Begrenzung der Häufigkeit von Anmeldeversuchen schützen. Dazu sind viele Hashing-Runden erforderlich.

Das Anmeldeformular . Ich habe es auf diese Weise implementiert (vorerst ohne Hashing).

Was genau wäre der Unterschied für einen Angreifer, wenn er eine Hash-URL oder eine Hash-Nutzlast derselben Daten anzeigen würde? Wenn Sie die Daten nicht in der URL haben möchten, verwenden Sie einen HTTP-POST anstelle eines HTTP-GET

Wird WS-Security von einem Browser unterstützt? Wenn es nicht bereits in den Browser integriert ist, kann die Sicherheit niemals besser sein als die Methode, mit der der Code an den Browser gesendet wird.
@kasperd muss über Javascript implementiert werden - obwohl es nicht gegen den Client sicher ist, schützt es vor einem MITM-Angriff. Hierfür gibt es ein Javscript [Bibliothek] (http://www.codeproject.com/Articles/373317/Ws-js-A-Ws-implementation-for-Node-js). Wie ich bereits sagte, wird es viel komplizierter sein, dies (richtig) zum Laufen zu bringen, als nur SSL zu implementieren.
Nein, es schützt nicht vor Mitm-Angriffen. Nichts, was Sie in Javascript implementieren, kann vor Mitm-Angriffen schützen. Entweder verwenden Sie SSL zum Schutz vor Mitm-Angriffen. In diesem Fall wird der Schutz durch SSL und nicht durch Ihren Javascript-Code bereitgestellt. Oder Sie verwenden kein SSL. In diesem Fall schützt Ihr Javascript-Code auch nicht vor Mitm-Angriffen, da der Javascript-Code manipuliert werden könnte.
@kasperd-Punkt genommen - Wenn der Javascript-Code signiert wäre, müsste der Browser über die Funktionalität zum Überprüfen von Signaturen verfügen, wodurch im Grunde nur SSL neu erstellt wird ...
Steve Sether
2014-12-27 04:16:56 UTC
view on stackexchange narkive permalink

Es gibt tatsächlich ein "sicheres" Authentifizierungsschema im Web, das älter als SSL ist und als Authentifizierung mit digitalem Zugriff bezeichnet wird. Was der Fragesteller fragt, ist also nicht ganz unmöglich. Dies ist weitaus weniger sicher als SSL und unterliegt dem brutalen Erzwingen des Kennworts durch Offline-Angriffe sowie der Verwendung eines alten, wenig vertrauenswürdigen Hashing-Algorithmus von MD5.

Ich würde immer noch den gleichen Rat geben wie Alle anderen jedoch, und sagen Sie, dass SSL bei weitem die bessere Lösung ist, als sich auf ein veraltetes System zu verlassen, das auf Herausforderungen und Antworten basiert und seit 1993 nicht mehr aktualisiert wurde.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...