Login ohne HTTPS, wie sichern?

76

Ist es für eine Webanwendung möglich, die Anmeldung dennoch etwas sicherer zu machen, wenn HTTPS nicht als Sicherheitsmaßnahme verfügbar ist? Z.B:

  • Token-Logins, um wiederholte Angriffe zu erschweren?
  • Verschlüsseln Sie das gesendete Passwort irgendwie aus einem HTML-Passwortfeld?

Insbesondere verwende ich CakePHP und einen AJAX POST-Aufruf, um die Authentifizierung auszulösen (einschließlich des angegebenen Benutzernamens und Passworts).

Update zum Problem:

  • HTTPS ist nicht verfügbar. Zeitraum. Wenn Ihnen die Situation nicht gefällt, betrachten Sie sie als theoretische Frage.
  • Es gibt keine expliziten Anforderungen, Sie haben alles, was HTTP, PHP und ein Browser (Cookies, JavaScript usw.) im wirklichen Leben bieten (keine magischen RSA-Binärdateien, PGP-Plugins).
  • Die Frage ist, was ist das Beste, was Sie aus dieser Situation machen können, das ist besser als das Senden der Passwörter im Klartext. Die Nachteile jeder dieser Lösungen zu kennen, ist ein Plus.
  • Jede Verbesserung, die besser ist als einfache Passwörter, ist willkommen. Wir streben keine 100% ige l33tG0Dhx0r-proff-Lösung an. Schwer zu knacken ist besser als kompliziert zu hacken, was besser ist als ein triviales Schnüffeln, das das Passwort enthüllt.
sibidiba
quelle
9
Wie sicher? Wie hoch sind die Einsätze (Baseball-Dollar-Zahl kann ein praktischer Leitfaden sein)? Wie mächtig sind potenzielle Angreifer? Ich würde keine Aktien handeln oder meine dunkelsten Geheimnisse auf einer Website ohne SSL teilen. :)
mctylr
2
@mctylr Diese Art von Sicherheit ist offensichtlich nicht militärisch, finanziell oder staatlich. Aber immer noch besser als die einfache Textanmeldung, die leider häufig für kleine Websites oder Websites verwendet wird, die hinter schweren Firewalls arbeiten müssen, die HTTPS herausfiltern, oder für billige Hosting-Websites, die kein HTTPS bereitstellen (nicht einmal eine selbstsignierte für eine andere URL). Die Frage interessiert sich für einen möglichen Weg, um jeden Aspekt der Sicherheit zu erhöhen.
Sibidiba
2
@ The Rook: Fakten und Szenarien, genau wie Anforderungen, sind nicht demokratisch
sibidiba
3
Wie schützt sich Ihre Anwendung vor Angriffen wie Feuerschaf oder Umgang mit OWASP A9?
Turm
4
Ich empfehle dringend, die Antwort auf diese Frage an andere weiterzugeben oder unbeantwortet zu lassen. Die aktuelle Antwort ist erschreckend.
Turm

Antworten:

75

HTTPS ist für die Aufrechterhaltung einer sicheren Verbindung zwischen einer Website und einem Browser von entscheidender Bedeutung. Öffentliche WLAN-Netzwerke gefährden Benutzer. Bei korrekter Verwendung ist HTTPS das einzige Tool , das Benutzerkonten vor dieser Sicherheitsanfälligkeit schützen kann .

Wenn Ihr Host HTTPS nicht unterstützt, kann ein Dienst wie Cloudflare Universal SSL verwendet werden, um sicherzustellen, dass alle Browser über HTTPS eine Verbindung zu Ihrer Site herstellen, auch wenn Ihr Server SSL / TLS nicht unterstützt . Die Verbindung zwischen Cloudflare und Ihrer Website bleibt weiterhin ungeschützt. Dieser Cloudflare-Dienst soll Benutzer jedoch vor Bedrohungen schützen, die in öffentlichen WLAN-Netzwerken auftreten. Aus der Sicht eines Penetrationstesters ist es sehr verdächtig, kein HTTPS bereitzustellen. Wenn Sie keine grundlegende Sicherheitsanforderung für die Bereitstellung von Datenverkehr bereitstellen, welche anderen Sicherheitsanforderungen fehlen Ihnen dann? HTTPS-Zertifikate können kostenlos mit Let's Encrypt oder Start SSL bezogen werden. Es gibt keinen legitimen Grund, HTTPS nicht zu unterstützen.

HTTPS ist wichtig, da es viel mehr als nur "Passwörter verschlüsseln" kann. Eine weitere wichtige Rolle besteht darin, zu verhindern, dass sich der Benutzer bei einem böswilligen Server anmeldet, der sich als echter Server ausgibt. Die Verwendung eines Systems zum alleinigen Schutz des Kennworts stellt immer noch eine Verletzung von OWASP A9 - Unzureichender Transportschichtschutz dar, da Sie weiterhin Sitzungsanmeldeinformationen im Klartext übertragen würden, was alles ist, was der Angreifer benötigt ( Firesheep ).

  1. JavaScript-basierte Kryptografie kann nicht zum Erstellen einer sicheren Transportschicht verwendet werden .

  2. "Token-Anmeldungen": Wenn ein Angreifer den Datenverkehr abhört, hat er den Benutzernamen / das Kennwort im Klartext und kann sich dann einfach mit diesen neuen Anmeldeinformationen anmelden. (Wiederholungsangriff)

  3. "Das übertragene Passwort irgendwie verschlüsseln": Nachdem sich die Person angemeldet hat, kann ein Angreifer den Datenverkehr abhören, um die gültige Sitzungs-ID (Cookie) zu erhalten, und diese dann einfach verwenden, anstatt sich anzumelden. Wenn die gesamte Sitzung mit SSL / TLS geschützt war, dann das ist kein Problem.

Es gibt andere komplexere Angriffe, die sowohl dieses System als auch unsere aktuelle SSL-Infrastruktur betreffen. Der SSLStrip- Angriff wird detaillierter. Ich empfehle dringend , Moxie Marlinspikes Blackhat 2009-Vortrag zu sehen , der zum HTTP-Strict-Transport-Security-Standard führt .

Turm
quelle
6
Mir ist (etwas) bewusst, was S in HTTPS bietet. HTTPS ist in diesem Fall jedoch nicht verfügbar. Meine Frage ist noch offen, was ist das Beste, was ist es wert, getan zu werden, wenn es nicht verfügbar ist?
Sibidiba
49
HTTPS ist nicht verfügbar. Bestehende Probleme können meistens nicht gelöst werden, indem die Situation in eine Situation geändert werden muss, in der das Problem nicht behoben wird. Angenommen, Sie sind nach einem Flugzeugabsturz am Südpol gestrandet. / Überlebender: Wie kommen wir da raus? Es gibt keine Mobilfunknetzabdeckung, um Hilfe anzurufen. / Sie: Wir müssen telefonisch Hilfe rufen! / Überlebender: Auf diesem Kontinent gibt es keine Netzabdeckung. / Sie: Die Netzabdeckung sollte immer verfügbar sein.
Sibidiba
6
Der Turm hat viele der unzähligen Vorbehalte aufgelistet, wie Sie sich selbst erschießen werden (Mitm ist hier besonders schlimm). Der einzige andere Vorschlag, den ich habe, ist die Digest-Authentifizierung, die nicht besonders gut ist. Es ist immer noch anfällig für MITM, da ich ohne eine SSL-Anmeldeseite nicht einmal weiß, ob der HTML-Code für die Anmeldeaufforderung von Ihnen stammt, sodass ich DA für mich deaktivieren könnte. Grundsätzlich machen Sie einen Witz über Ihr Passwortsystem. Ich sage das nicht, um gemein oder direkt zu sein. Finden Sie heraus, wie Sie das Problem ohne SSL lösen können, oder beten Sie, dass sich niemand für Ihre Website interessiert.
Jason
9
@sibidiba: Der Punkt ist, dass Sie es ohne SSL nicht sicher machen können. Ja, das Schema, mit dem Sie verknüpft haben, ist "besser als Klartextkennwörter". Aber es ist immer noch nicht einmal "etwas sicher". Manchmal gibt es einfach keine gute Lösung für ein Problem, außer das Szenario zu ändern. Wenn Sie Sicherheit wünschen, ist Ihre Hosting-Wahl (oder was auch immer die Einschränkung ist) falsch.
Andrew Coleson
3
@sibidiba: Du musst den Teil verpasst haben, in dem ich sagte "Ja, es ist besser." Das bedeutet nicht, dass Sie WEP als "sicher" bezeichnen würden, da dies nicht der Fall ist. Ja, es ist eine Frage der Semantik, aber es ist eine wichtige Unterscheidung, ob Sie etwas "sicher" nennen.
Andrew Coleson
16

Die kurze Antwort lautet: Ohne SSL-Verschlüsselung von Endpunkt zu Endpunkt ist es unmöglich, dies sicher zu tun ...

Einer der Hauptgründe dafür ist, dass Sie in einem Browser keine sichere Krypto erstellen können. Siehe diese Referenz - Javascript-Kryptographie gilt als schädlich .

Darüber hinaus können Sie nicht sicher sein, dass die Quelle der Anmeldeinformationen tatsächlich die ist, mit der Sie sprechen. Das bedeutet, dass es ohne SSL absolut keine Möglichkeit gibt, sicher zu sein, dass kein Man-In-The-Middle-Angriff stattfindet .

Also nein, du kannst es nicht tun.

Versuchen Sie es außerdem nicht einmal. Holen Sie sich SSL. Sie können kostenlose Zertifikate erhalten. Hosts geben Ihnen normalerweise eine dedizierte IP für ein paar $$$ pro Monat. Und wenn Sie sich wirklich um Sicherheit kümmern, würden Sie sowieso mindestens eine VM mit einer dedizierten IP-Adresse verwenden.

Dies überhaupt zu versuchen, wäre bestenfalls Sicherheit durch Dunkelheit und im schlimmsten Fall nichts. SSL ist ein gelöstes Problem. Warum nicht diese Lösung verwenden? Sicherheit ist nicht zu erraten. Verwenden Sie die richtigen Techniken. Versuche nicht, deine eigenen zu erfinden. Es wird nicht funktionieren ...

ircmaxell
quelle
1
Ich möchte nur hinzufügen: Wenn jemand diesen Gedanken liest, dass er einen Weg gefunden hat, ein sicheres Protokoll besser als TLS zu entwickeln, sollte er es zur Prüfung eines neuen Internetstandards an die IETF senden. :)
Scott Arciszewski
16

Da Sie auf dem Webserver kein SSL ausführen können und kein Sicherheitsexperte sind, suchen Sie nach einem vorhandenen sicheren Authentifizierungsdienst, den Sie verwenden können, und lassen Sie ihn sowohl das SSL als auch die Komplexität der Verarbeitung von Anmeldeinformationen für Sie übernehmen.

Insbesondere würde ich vorschlagen, dass Sie einen kostenlosen Authentifizierungsdienst eines Drittanbieters wie OpenID verwenden . Sie haben Bibliotheken für PHP, darunter eine für CakePHP .


Bearbeiten: (über Risiken)

Die Verwendung eines sicheren Authentifizierungsdienstes eines Drittanbieters (der HTTPS selbst verwendet) kann das Problem der Authentifizierung selbst ohne Verwendung von HTTPS (auf Ihrem Server) verringern, schließt jedoch die Möglichkeit von Angriffen nicht vollständig aus.

Die häufigsten zwei Angriffe sind Wiederholungsangriffe und Sitzungsentführungen, bei denen der Angreifer entweder später ein echtes Anmeldesitzungstoken wiederverwenden oder ein gültiges Sitzungstoken für seinen eigenen böswilligen Zweck verwenden kann.

Der Wiederholungsangriff kann gemindert werden, indem das Sitzungstoken abläuft und vorzugsweise ein Nonce verwendet wird , um die Sitzungswiederholung zu verhindern und das Risiko einer Sitzungsentführung zu verringern. Bei einer Nonce generiert eine legitime Sitzung einen Fehler, wenn sie erfolgreich entführt wurde, da die Nonce abgelaufen ist (verwendet wurde) und ihre eigene Sitzung nicht mehr gültig ist.

Wenn Sie HTTPS nicht zum Verschlüsseln des Sitzungstokens während der Übertragung von und zu Ihrem Server verwenden können, können Sie aktive Angriffe wie Sitzungsentführung oder Man-in-the-Middle- Angriff nicht vollständig verhindern . Dies kann in einigen Fällen akzeptabel sein, z. B. bei Websites mit einer kleinen Benutzerbasis für nichtkommerzielle Zwecke.

mctylr
quelle
1
Ich denke genau. Wenn Sie kein SSL auf Ihrem Server haben können, lassen Sie das SSL von einem Dritten für Sie erledigen.
Stevenf
7
Das ist eine sehr schlechte Idee. Das Problem ist, dass die Authentifizierung die geringste Sorge ist. Sie müssen die gesamte Sitzung schützen. Der schwächste Teil Ihres Systems ist die Stärke des gesamten Systems. Und seit Sie OpenID
aufgerufen haben
2
@ircmaxell Mit Ausnahme des von Ihnen zitierten Artikels wird nicht klargestellt, dass seine Demonstration nicht die mögliche Lösung für die möglicherweise bereits vorhandene Schwachstelle der serverseitigen Sitzungsverwaltung identifiziert, bei der eine Sitzung mit der IP-Adresse verschlüsselt ist. vielleicht ein Nonce oder Salz, und hat eine Verfallszeit. Dh ein Angreifer würde einen aktiven Angriff benötigen, der IP-Spoofing ausführt, anstatt nur passiv auf TCP / IP- oder WiFi-Verkehr zu hören (zu schnüffeln), während der legitime Benutzer aktiv angemeldet ist.
mctylr
2
Notwendigkeit, die gesamte Sitzung zu schützen : Dies führt auf die Tatsache zurück, dass Sie für eine umfassende Antwort eine Risikobewertung der jeweiligen Situation durchführen und das Risiko / den Nutzen von Angriffen im Vergleich zur Sicherheit gewichten müssen. Wenn TLS / SSL nicht verfügbar ist, unterliegt jede Lösung der mangelnden Geheimhaltung (oder der Überverfügbarkeit im Sinne der CIA ). Dies bedeutet jedoch nicht zwangsläufig, dass Integrität, Authentifizierung oder Nicht-Zurückweisung je nach Bedarf völlig unmöglich sind auf dem erforderlichen Vertrauensniveau.
mctylr
Diese Antwort klingt irgendwie richtig, aber ich denke, jeder Authentifizierungsanbieter mit Selbstachtung verlangt, dass Sie mindestens die gleichen Sicherheitsanforderungen haben, die eine TLS-Sitzung bietet. Es bleibt also abzuwarten, ob es sich um eine praktische Lösung handelt. Und ja, Sie würden die an den Browser gesendeten Daten immer noch nicht schützen - aber das ist weniger schlimm, als die Authentifizierungsdetails zu verlieren oder die Wiedergabe zuzulassen.
Maarten Bodewes
13

Wie Sie vorgeschlagen haben, können Sie möglicherweise bei jeder Erstellung der Seite ein eindeutiges Token generieren. Das gleiche Token müsste mit den Formulardaten zurückgesendet werden und könnte nicht wiederverwendet werden. Sie können das Kennwort auch schützen, indem Sie JavaScript zum Hashing verwenden, wenn Sie sich darauf verlassen können, dass es von Ihren Benutzern aktiviert wird.

Dieses Schema ist jedoch immer noch nicht sicher. Ein Angreifer konnte immer noch alles über den Draht laufen sehen. Sie könnten das Token abfangen und eine Antwort an Sie zurücksenden, bevor der Benutzer dies tut. Oder sie können einfach darauf warten, dass sich jemand anmeldet, die Anmeldeinformationen dieser Person stehlen (wenn sie über die Leitung gesendet werden) und später einfach ihre eigene Anmeldeanforderung stellen.

Fazit : Sie müssen HTTPS verwenden, um die Sicherheit der Website zu gewährleisten.

Justin Ethier
quelle
6

Sie können das Passwort mit Javascript verschlüsseln und auf dem Server entschlüsseln.

Ich würde empfehlen, ein RSA-Schlüsselpaar auf dem Server zu generieren, den öffentlichen Schlüssel zusammen mit einem zeitgesteuerten Salt an den Browser zu senden und dann das Kennwort in Kombination mit dem Salt mit dem öffentlichen Schlüssel in Javascript zu verschlüsseln.

Eine RSA-Implementierung in Javascript finden Sie hier

Sie sollten sowohl die IP-Adresse als auch den gesamten X-FORWARDED-FOR- Hedaer in die Authentifizierungscookies aufnehmen, um den Diebstahl von Cookies hinter Proxys zu verhindern.

Wenn Sie mit sensiblen Daten arbeiten, können Sie einen Zufall generieren AES-Schlüssel in Javascript und ihn dann zusammen mit dem mit RSA verschlüsselten Kennwort an den Server senden.
Sie können dann die gesamte Anwendung dazu bringen, verschlüsselte AJAX-Anforderungen von einer einzelnen Seite aus zu verwenden und überhaupt kein Auth-Cookie zu verwenden.

Beachten Sie, dass es ohne SSL nicht möglich ist, sich vor einem aktiven Man-in-the-Middle-Angriff zu schützen. Ein aktiver Angreifer kann Ihre Site vollständig durch seinen eigenen Proxy ersetzen, und es gibt keine Möglichkeit, sich dagegen zu verteidigen. (Da kein guter Code bekannt ist)

SLaks
quelle
1
Dies ist eine gültige Verwendung von RSA, aber es ist ein strittiger Punkt. Es wird niemanden davon abhalten, gehackt zu werden.
Turm
4
Eigentlich sehe ich nicht, wie dieser Ansatz einen Man-in-the-Middle-Angriff verhindert.
mctylr
2
Abgesehen davon, dass RSA auf der Clientseite nicht sicher durchgeführt werden kann . Also all das funktioniert umsonst ...
ircmaxell
3
Dieser Beitrag sollte geändert werden, es handelt sich um Cargo-Cult-Sicherheit. matasano.com/articles/javascript-cryptography
Turm
1
@ Jeremy Banks gute Frage. Im Szenario von SLacks kann ein Angreifer das Klartextkennwort erhalten, indem er die HTTP-Antwort ändert und den Verschlüsselungsprozess rückgängig macht . Zwei weitere Ressourcen zu diesem Thema: owasp.org/index.php/Session_Management_Cheat_Sheet und owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet . Kurz gesagt, wenn ein böswilliger Benutzer ein Administratorkonto erhalten kann, ist das Spiel vorbei, wen interessiert das Passwort?
Turm
6

Sie können HTTP Digest verwenden Authentifizierung verwenden, die von den meisten Browsern unterstützt wird und das Kennwort nicht eindeutig über das Netzwerk sendet.

Der Nachteil ist das hässliche Anmeldefeld, das von broswer angezeigt wird. Wenn Sie sich lieber an Formulare halten, können Sie genau dasselbe Protokoll wie HTTP Digest in Ihrer Formularauthentifizierung implementieren: Senden Sie versteckte Felder, die den Bereich und die Herausforderung enthalten, und lassen Sie den Client das Nonce in JavaScript hinzufügen und den Digest berechnen. Auf diese Weise verwenden Sie ein bekanntes und bewährtes Austauschprotokoll, anstatt Ihr eigenes Protokoll zu erstellen.

HTTP Digest erfordert nur Hash-Operationen.

Remus Rusanu
quelle
Ist eine Abmeldung jetzt möglich? Wie kann ich vom Server aus feststellen, dass die Anmeldung erfolgreich war?
Sibidiba
1
Sie haben immer noch die Kontrolle über den Authentifizierungsprozess. Dies geschieht auf den Server-PHP-Skripten. Sie authentifizieren das Antwortformular anhand einer Benutzerdatenbank, in der Sie den Benutzernamen und den HA1-Teil des http-Digests haben, d. H. md5 (Benutzer: Realm: Passwort). Aus der Antwort rekonstruieren Sie den Digest-Hash, beginnend mit dem in der Datenbank gespeicherten HA1, und vergleichen ihn mit der Antwort im Formular "Senden". Wenn sie übereinstimmen, bedeutet dies, dass der Benutzer das richtige Kennwort hatte.
Remus Rusanu
1
Der große Vorteil gegenüber anderen Schemata besteht darin, dass ein einheitliches Authentifizierungsmodell für Browser- / Benutzersitzungen (mithilfe von Formularen und Cookies, jedoch ohne Übertragung des Kennworts über das Kabel) und REST-Services mithilfe von HTTP Digest möglich ist.
Remus Rusanu
Das Abmelden erfolgt wie gewohnt durch Zurücksetzen des Auth-Cookies. Es ist jedoch wahr, dass es viel schwieriger ist, wenn der Benutzer im Browser auf einen Teil trifft, der ihn zum HTTP-Digest herausfordert (z. B. eine REST-URL von der Site eingibt), und wenn der Benutzer im Browser-Anmeldedialog das richtige Kennwort eingibt Abmelden: Der Benutzer muss das Kennwort manuell aus der Browsereinstellung löschen. Dies sollte jedoch nicht normal geschehen, da der UI-Teil der Site normalerweise vom REST-Teil getrennt ist.
Remus Rusanu
2

Was ist mit der HTTP Digest-Authentifizierung ? ? Es bietet Sicherheit durch MD5-Hashing-Benutzernamen, Passwort und eine Nonce (unter anderem), bevor es an den Server gesendet wird. MD5 ist nicht wirklich sicher, aber es ist ein guter Weg für einfache Sicherheit mit HTTP.

Dies hindert Hacker natürlich nicht daran, die Nachricht zu ändern ... aber es sichert Ihr Passwort.

AndiDog
quelle
1
Der Digest kann gerochen und beantwortet werden. Für die HTTP-Digest-Authentifizierung ist HTTPS erforderlich, um die als http-Header "Authorization" übertragenen Anmeldeinformationen zu schützen.
Turm
MD5 ist sicher für die Schlüsselableitung. Es ist jedoch nicht sicher als Passwort-Hash, und daher kann das Passwort immer noch auslaufen.
Maarten Bodewes
2

HTTPS verfügt über zahlreiche Anwendungsfälle, von denen die meisten zur Abwehr von Man-in-the-Middle-Angriffen entwickelt wurden. Jeder, der die Einstellung eines Hackers hat, wird schaudern, wenn er Ihnen sagt, dass es keinen anderen Weg gibt als den etablierten, etwas zu erreichen. Tatsache ist, dass nur weil Sie TLS (den Standard, den modernes HTTPS verwendet) verwenden, dies nicht bedeutet, dass Sie es gut verwenden. Darüber hinaus hindert die bloße Verwendung von TLS niemanden daran, bekannte Schwachstellen auszunutzen. So wie Sie möglicherweise kreative Wege finden, um Ihre Daten zu schützen, gibt es Menschen, die kreative Wege finden, um Ihre Sicherheitsmaßnahmen auszunutzen.

Also, was tun?

Wenn Sie auf TLS verzichten möchten, ist es zunächst hilfreich zu verstehen, wie es funktioniert. Und es geht um einen Handschlag.

Sobald sich Client und Server auf die Verwendung von TLS geeinigt haben, verhandeln sie mithilfe eines Handshake-Verfahrens eine zustandsbehaftete Verbindung. [7] Während dieses Handshakes vereinbaren Client und Server verschiedene Parameter, mit denen die Sicherheit der Verbindung hergestellt wird:

  • Der Handshake beginnt, wenn ein Client eine Verbindung zu einem TLS-fähigen Server herstellt und eine sichere Verbindung anfordert und eine Liste der unterstützten Cipher Suites (Chiffren und Hash-Funktionen) anzeigt.
  • Aus dieser Liste wählt der Server eine Verschlüsselungs- und Hash-Funktion aus, die er ebenfalls unterstützt, und benachrichtigt den Client über die Entscheidung.
  • Der Server sendet seine Identifikation in Form eines digitalen Zertifikats zurück. [Widerspruch] Das Zertifikat enthält normalerweise den Servernamen, die vertrauenswürdige Zertifizierungsstelle (CA) und den öffentlichen Verschlüsselungsschlüssel des Servers.
  • Der Client kann sich an den Server wenden, der das Zertifikat ausgestellt hat (die vertrauenswürdige Zertifizierungsstelle wie oben), und die Gültigkeit des Zertifikats bestätigen, bevor er fortfährt.
  • Um die für die sichere Verbindung verwendeten Sitzungsschlüssel zu generieren, verschlüsselt der Client eine Zufallszahl mit dem öffentlichen Schlüssel des Servers und sendet das Ergebnis an den Server. Nur der Server sollte es mit seinem privaten Schlüssel entschlüsseln können.
  • Aus der Zufallszahl generieren beide Parteien Schlüsselmaterial für die Ver- und Entschlüsselung. [Widerspruch] Damit ist der Handshake abgeschlossen und die gesicherte Verbindung wird gestartet, die mit dem Schlüsselmaterial verschlüsselt und entschlüsselt wird, bis die Verbindung geschlossen wird.

Wenn einer der oben genannten Schritte fehlschlägt, schlägt der TLS-Handshake fehl und die Verbindung wird nicht hergestellt.

Quelle: Wikipedia

Also ist es möglich? Ja. Mir wurde beigebracht, dass alles möglich ist. Es mag teuer sein, aber es ist immer möglich.

Ich möchte vollständig offenlegen, dass ich KEIN Sicherheitsexperte bin, sondern nur ein Enthusiast. Ich empfehle nicht, dies für ein Produktionsprojekt oder etwas anderes als Ihre eigene Erbauung zu versuchen. Sie sollten auf jeden Fall diesen SO-Beitrag lesen der eine hervorragende Erklärung für Hindernisse bei der Einrichtung Ihres eigenen Sicherheitsprotokolls bietet.

Wenn Sie jedoch weitermachen möchten, sind hier einige Gedanken, die Ihnen in den Sinn kommen. Dies sind Realitäten, die existieren werden, unabhängig davon, welchen direkten Weg Sie mit diesem Projekt gegangen sind.

  • HTTPS wird von allen gängigen modernen Browsern unterstützt. Trotz dieser Realität sind die HTTPS-Ladezeiten langsamer als bei normalem HTTP. Ohne umfangreiche Produktion ist es sehr wahrscheinlich, dass Ihre alternative Implementierung einen Bruchteil so sicher ist und gleichzeitig erheblich langsamer. Dies ist ein Nachteil jeder selbst erstellten Implementierung, es sei denn, Sie verwenden Browserfunktionen. Dadurch schließt sich der Kreis zurück zur Verwendung von TLS, wie es das moderne HTTPS verwendet.

  • Wenn Sie es schaffen, Ihr Passwort ohne TLS auf der Browserseite mit Javascript so unvorhersehbar zu verschlüsseln, dass ein MiTM-Angriff schwierig wäre, ruhen Sie sich nicht dort aus. Sie sollten auch die Daten sichern, die Sie hin und her senden. Ansonsten ist das zu verschlüsselnde Passwort wirklich irrelevant. Sicher, ein Angreifer kennt das Passwort von bobsmith109 möglicherweise nicht, benötigt es jedoch nicht, da er jede einzelne Aktivität im Netzwerk abhören kann. Er weiß, wann sich bobsmith109 anmeldet, kann wahrscheinlich seine IP und alle anderen vertraulichen Daten verfolgen, die Sie hin und her senden.

  • Unabhängig davon, welche Sicherheitsmaßnahmen Sie ergreifen, gibt es umfassende Sicherheit. Eine Sache, die Sie sofort tun können, ist sicherzustellen, dass Sie Ihre Daten in der Datenbank verschlüsseln und gleichzeitig sichere Passwörter benötigen.

Ich bekräftige, dass ich kein Sicherheitsexperte bin, und rate davon nachdrücklich davon ab , Ihre Neugier zu stillen. Es ist astronomisch unwahrscheinlich, dass Sie eine praktikable Alternative zu TLS schaffen können, ohne dass eine außerordentlich große Gruppe von Sicherheitsexperten jahrelang, wenn nicht jahrzehntelang an einem Projekt beteiligt ist. Dies kann SSL / TLS vorweisen. Ein guter Ausgangspunkt für die weitere Vorgehensweise ist jedoch, das obige Handshake-Modell zu betrachten und zu prüfen, wie Sie eine Version davon ohne TLS implementieren können.

Ich möchte nicht in meinem Beitrag mitteilen, dass die meisten realen Hindernisse für die Verwendung von HTTPS aktiv bekämpft werden. Einer der größten - Kosten - steht kurz davor, kein Thema zu werden. Eine kostenlose Zertifizierungsstelle wird im 2. Quartal 2015 herauskommen und von einigen großen Waffen unterstützt werden, darunter Mozilla und Akamai, um nur einige zu nennen. Hier ist ein Artikel .

smcjones
quelle
Diese "Antwort" gibt nichts an, was verwendet werden kann. Es heißt "Also ist es möglich?" aber es gibt nicht einmal an, was möglich ist. Einige winken mit der Hand darüber , dass es teuer ist, ohne auch nur anzugeben, was es ist. Wahrscheinlich "Einrichten Ihres eigenen Sicherheitsprotokolls". Dann endet es mit einigen Fallstricken beim Erstellen Ihres eigenen Protokolls. Nur grundlegende Sicherheitshinweise, aber keine Lösung (die möglicherweise nicht existiert). Nichts darüber, wie MitM-Angriffe verhindert oder das Problem mit fehlenden vertrauenswürdigen CA-Zertifikaten in JavaScript umgangen werden kann.
Maarten Bodewes
2

Login ohne HTTPS, wie sichern?

Da es keinen sicheren Kanal zwischen Ihrem Server und Ihrem Client gibt:

  • Da es keinen sicheren Kanal gibt, kann jeder Ihren Datenverkehr abhören.
  • Da jeder den Datenverkehr abhören kann, sind Sie offen für einen MITM-Angriff.
  • Da Sie für MITM-Angriffe offen sind, gibt es keine Garantie dafür, dass Ihr Client eine legitime Seite sieht.
  • Da die Seiten nicht legitim sind und Ihre Seite tatsächlich nicht bereitgestellt wird (der Typ in der Mitte stellt die Seiten bereit), werden alle serverseitig verwendeten Tricks unbrauchbar.

Was kannst du tun? Theoretisch?

  • Sowohl Client als auch Server müssen Verschlüsselung verwenden, um Snooping / MITM weniger anfällig zu machen.
  • Angenommen, Sie können keinen Handschlag haben.
  • Angenommen, Ihr Client verfügt bereits über Ihren Schlüssel und weiß, wie man denselben Kauderwelsch wie Ihr Server spricht.
  • Wie wäre es mit etwas SSL über HTTP, das jedoch in eine Base64-codierte Nachricht für etwas Kauderwelsch eingeschlossen ist?

Aber warte ... Da du gesagt hast, dass es keine magische Binärdatei oder kein Plugin gibt, nicht einmal RSA, weiß ich nicht, ob dies möglich ist, außer für (einige möglicherweise sehr schwache) interne Verschlüsselung.

- -

dnozay
quelle
Jede interne Verschlüsselung kann trivial entfernt werden.
Scott Arciszewski
1

Sie können versuchen, es zu einem bestimmten Zeitpunkt zu replizieren, indem Sie die Verschlüsselung mit öffentlichem Schlüssel (möglicherweise GPG) verwenden und das Browser-Caching verwenden.

Dies ist nicht sicher, selbst das Einrichten von SSL reicht für einen erfahrenen Angreifer nicht aus. Sie müssen HSTS, Pinning mit öffentlichen Schlüsseln usw. verwenden, um eine Website heute als sicher zu betrachten .

Der Rest der Antwort ist nur ein Denkanstoß.

  1. Erstellen Sie ein öffentlich-privates Schlüsselpaar. Halten Sie privat sicher.
  2. Erstellen Sie eine JS-Datei mit dem öffentlichen Schlüssel und einer encryptFunktion und suchen Sie einen sicheren Verschlüsselungsalgorithmus. Diese Funktion sollte eine bestimmte Zeichenfolge (serialisierte Form) mit einem zusätzlichen Zeitstempel verschlüsseln, um einen Replikationsangriff zu vermeiden.
  3. Servieren Sie diese Datei mit Cache-Control:public, max-age=31536000HTTP-Header. Wir versuchen zu mildern, wenn der Angreifer versucht, das Skript zu ersetzen. Die Datei wird immer aus dem Browser-Cache bereitgestellt.
  4. Senden Sie alle Formulare mit der encryptFunktion über Javascript . Servieren Sie diese mit dem gleichen Header wie oben.
  5. decryptÜberprüfen Sie auf der Serverseite der Daten den Zeitstempel, ob er noch gültig ist. Wenn nicht, verwerfen Sie es.
  6. Erstellen Sie ein Cookie-Token, das nur einmal für sehr kurze Zeit verwendet werden kann. Wenn der Angreifer einen Cookie erfasst, hat er nicht viel Zeit, um Dinge zu tun. Wenn der Angreifer jedoch schnell genug ist, kann er den ursprünglichen Benutzer abmelden.
  7. Ändern Sie die Cookies bei jeder Antwort. Aber was machen Sie dann, wenn der Benutzer mehrere Anfragen gleichzeitig sendet und diese dann in umgekehrter Reihenfolge eintreffen? Welcher Cookie ist gültig? Dies schafft Unmengen von Problemen auf Kosten eines falschen Sicherheitsgefühls.

Listener können die hin und her gehenden Daten nicht verwenden und die vorhandenen JS Dateien erst ändern / einfügen , wenn der Cache abläuft / der Benutzer den Cache löscht. Jeder hoch entwickelte Angreifer kann jedoch die gesamte HTMLDatei ersetzen, wodurch alle soeben erwähnten Sicherheitsmaßnahmen verworfen werden. Wenn Sie diese Datei / dieses Formular zumindest bereitstellen können HTTPS, können Sie damit durchkommen, sie auf Github-Seiten oder was auch immer platzieren. Wenn Sie der Datei jedoch eine andere Domäne hinzufügen, müssen Sie CORSdie empfangende Domäne einrichten, damit dies funktioniert.

Noch ein Versuch

Einmalkennwörter per E-Mail gesendet.

  1. Der Benutzer füllt seine E-Mail aus, klickt auf einen Link, der dann einen Link zu seiner E-Mail mit einem Token sendet, mit dem er sich anmelden kann.
  2. Benutzer klickt auf den Link
  3. Der Server überprüft das Token und meldet den Benutzer an.
  4. Rollt die Cookies wie im vorherigen Beispiel.

Alles in allem ist alles, was Sie tun, nicht sicher . Bei einem schnellen, hoch entwickelten Angreifer steht nichts mehr im Wege.

Holen Sie sich SSL, wenn die Infrastruktur dies nicht unterstützt, ändern Sie es. Wenn Ihr Manager nicht an SSL glaubt, überzeugen Sie ihn. Schaffen Sie kein falsches Sicherheitsgefühl. Schützen Sie die Daten Ihres Benutzers. Abhängig von Ihrem Standort sind Sie gesetzlich verpflichtet, die Daten Ihrer Benutzer zu schützen.

Lassen Sie uns dann darüber sprechen, wie Sie eine Site mit SSL sicher machen.

Umur Kontacı
quelle
1

Erstellen Sie ein öffentliches / privates Schlüsselpaar mit einer asymmetrischen Verschlüsselung.

Erstellen Sie einen symmetrischen Schlüssel auf dem Server.

Senden Sie den öffentlichen Schlüssel an die Clientseite.

Erstellen Sie einen Zufallsschlüssel für die Client-Seite mit symmetrischer Verschlüsselung.

Verschlüsseln Sie diesen zufälligen Schlüssel mit der Clientseite des öffentlichen Schlüssels.

Senden Sie den verschlüsselten Schlüssel an den Server.


Der Server führt Folgendes aus:

ein. Entschlüsselt den zufälligen symmetrischen Schlüssel mit dem privaten Schlüssel.

b. Erstellt ein Token, das den generierten Clientschlüssel enthält.

c. Unterzeichnet den Token.

d. Verschlüsselt das Token mit dem Server-Symmetrieschlüssel.

e. Verschlüsselt das bereits verschlüsselte Token mit dem vom Client generierten Schlüssel.

f. Sendet das verschlüsselte Token nach unten.


Der Client erhält dieses Token und führt folgende Schritte aus:

ein. Entschlüsselt das Token mit dem generierten Schlüssel.

b. Speichert das entschlüsselte Token.

c. Zu diesem Zeitpunkt wird das gespeicherte Token nur mit dem Server-Symmetrieschlüssel verschlüsselt.


Auf jedem vom Client zum Server:

ein. Verschlüsseln Sie die ausgehenden Daten mit dem vom Client generierten Schlüssel.

b. Senden Sie das Token + verschlüsselte Daten


Bei jeder Anfrage erhält der Server:

ein. Entschlüsseln Sie das Token mit dem Server-Symmetrieschlüssel.

b. Überprüfen Sie die Signatur.

c. Entschlüsseln Sie die Daten mit dem vom Client generierten Schlüssel, der im Token gespeichert ist.

Hedzer
quelle
Ich nehme an, auf diese Weise wird die Verbindung gesichert, aber eine anschließende Anmeldung sollte trivial sein. Dies ist wie eine rudimentäre Version von HTTPS, die manuell erstellt wird.
Hedzer
0

Schauen Sie sich "The Secure Remote Password Protocol" an .

Anstatt es selbst zu formulieren, möchte ich aus ihrer Website zitieren:

Das Secure Remote Password-Protokoll führt eine sichere Remote-Authentifizierung für kurze, vom Menschen einprägsame Kennwörter durch und widersteht sowohl passiven als auch aktiven Netzwerkangriffen.

und:

Das [The] -Protokoll kombiniert Techniken von Zero-Knowledge-Proofs mit asymmetrischen Schlüsselaustauschprotokollen und bietet eine deutlich verbesserte Leistung gegenüber vergleichsweise stark erweiterten Methoden, die Angriffen mit gestohlenen Verifizierern wie Augmented EKE oder B-SPEKE widerstehen.

Obwohl die Stanford University selbst keine Implementierungen für PHP und JavaScript bereitstellt, sind sie mit einigen Implementierungen von Drittanbietern verknüpft.

Einer dieser Links führt zu "Clipperz" , einem Online-Passwort-Manager. Es ist auch als Community Edition auf GitHub verfügbar. Dort hosten sie ihre "Javascript-Crypto-Library" , die das Protokoll implementiert, und den "Password-Manager" selbst, der in PHP und Python geschriebene Backends enthält.

Ich kann nicht sagen, wie schwierig es wäre, die relevanten Teile des Codes zu extrahieren, aber vielleicht können Sie ihre Implementierung wiederverwenden (sie ist unter AGPL lizenziert).

Bearbeiten 24.10.2014:

Wikipedia-Artikel über SRP listet einige weitere Implementierungen auf. Relevant für PHP / JS:

ben
quelle
2
JavaScript kann in diesem Zusammenhang nicht als Sicherheitssystem verwendet werden: matasano.com/articles/javascript-cryptography
Turm
SRP ist ein großartiges Protokoll und wird oft übersehen. Zumindest wird kein Passwort im Klartext gesendet, bevor ein gemeinsames Geheimnis eingerichtet wird (das zur Authentifizierung verwendet werden kann). Ich stimme jedoch rook zu, dass es die Probleme mit JS-Krypto nicht löst.
Maarten Bodewes
-1

Die beste Lösung, die ich für etwas sichere HTTP-Verbindungen gesehen habe, ist die Verwendung einer Javascript-Implementierung von md5sum (oder eines anderen Hashs), um die Übertragung des Kennworts im Klartext zu vermeiden. Sie können einen Formular-Onsubmit-Handler in Javascript erstellen, der das Kennwortfeld durch einen Hash des ursprünglichen Werts ersetzt. Dies erhöht die Sicherheit einer unsicheren Verbindung in bescheidenem Maße, setzt jedoch voraus, dass Javascript im Browser ausgeführt wird, um ordnungsgemäß zu funktionieren.

brandon k
quelle
Dies stoppt nichts, der Angreifer entführt die Sitzung nur, nachdem sie authentifiziert wurde.
Turm
1
Was auch immer Michael sagte. Wenn Sie sich für md5 entscheiden und mindestens einen Server eine eindeutige Herausforderung senden lassen, sollte der Client md5 senden (Herausforderung + Pass). Das Senden von md5 (Passwort) ist für die meisten Benutzer dasselbe wie das Übergeben von clear. Mehr als nur eine Wiederholung, das größere Problem wäre, dass ein passiver Angreifer den größten Teil des Passworts Ihres Benutzers knacken kann. Auch wenn Sie über http sind und einen aktiven Angreifer haben, abgesehen von der Wiedergabe von Formularen und dem Hijacking, wurde gezeigt, dass der Angreifer ein Skript einfügen kann, um das Anmeldeformular so zu ändern, dass er eine Kopie des eingegebenen Benutzernamens und Kennworts erhält. Verwenden Sie https, es sei denn, Sie unterstützen ein seltsames Mobilgerät.
mar
1
@Rook Ihre Kritik gilt für jede plausible Lösung, die kein SSL verwendet, wie Sie bereits ausführlich angegeben haben. Nehmen wir an, dass sie alle dafür anfällig sind.
Nick Johnson
"setzt aber voraus, dass Javascript im Browser ausgeführt wird, um ordnungsgemäß zu funktionieren." ... und der Angreifer kann das js einfach durch etwas ersetzen, das ihm das Passwort sendet.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
1
JavaScript kann in diesem Zusammenhang nicht als Sicherheitssystem verwendet werden: matasano.com/articles/javascript-cryptography
Turm
-2

Ich denke, Sie interessieren sich für die sichere Übertragung des Passworts an den Server? Meine Antwort lautet: Übertragen Sie keine Passwörter an den Server :)

Tatsächlich können Sie möglicherweise nichts vom Browser (Benutzer) zum Server übertragen, um den Benutzer zu authentifizieren, da ein Angreifer, der http-Verkehr ausspioniert, auch die Daten erneut übertragen und sich authentifizieren kann.

Vorschlag:

Eine offensichtliche Lösung wäre die Verwendung einer einmaligen Einweg-Transaktionsauthentifizierung, die vom Server ausgeht. wie eine Transaktionsnummer, die nur einmal verwendet werden kann. Schließlich benötigen Sie noch einmal einen sicheren Kanal, um die Liste der Transaktionsnummern mit dem Benutzer zu synchronisieren.

Sie könnten einen Google-Authentifikator verwenden , benötigen jedoch einmal einen sicheren Kanal, um die Parameter auf beiden Seiten einzurichten. Wenn Sie E-Mails als sicher betrachten, ist dies ein guter Weg.

Hol dir welche
quelle
Was ist mit dem Schutz anderer Authentifizierungsdaten, z. B. Sitzungs-IDs? Kennen Sie die OWASP Top 10?
Turm
lol, der Autor fragt nach einer Möglichkeit, sich ohne https sicher anzumelden. Natürlich gibt es noch viele andere Punkte zu beachten, aber wer hat nach den Sitzungs-IDs gefragt? Sind Sie sicher, dass der Autor Sitzungen beibehalten möchte?
ComeGetSome
Warum nur einen Authentifizierungstyp schützen? Dieser Beitrag scheint mir eine Frachtkult-Sicherheit zu sein.
Turm
Der ganze Beitrag ist gegen Owasp. das heißt nicht, dass es keine Antwort gibt.
ComeGetSome
-2

Ich habe das gleiche Problem mit einem meiner Systeme. Ich habe Schritte unternommen, um die Sicherheit zu erhöhen, ohne die Benutzererfahrung durch verschlungene Mechanismen zu beeinträchtigen. Was mir auffiel, war, dass sich die überwiegende Mehrheit der Benutzer von demselben Computer mit demselben Browser (aber nicht unbedingt derselben IP-Adresse) oder von mehreren Browsern (z. B. Desktop oder Handy) aus anmeldete. Ich beschloss, damit ein Muster zu identifizieren.

1) Während der Registrierung müssen Benutzer über sichere Kennwörter (um Wörterbuchangriffe zu verhindern), eine Sicherheitsfrage / -antwort und eine Standard-E-Mail-Überprüfung (als Nachweis der realen Person) verfügen.

2) Während der Anmeldung wird nach 5 fehlgeschlagenen Anmeldeversuchen (nicht vorher) ein Captcha angezeigt, um Brute-Force-Angriffe zu verhindern.

3) Schließlich habe ich nach einer erfolgreichen Anmeldung einen Hash von Teilen der Benutzeragentenzeichenfolge erstellt, der das Betriebssystem des Benutzers, den Browser (im Allgemeinen keine Versionen) und die Sprache enthält und eine Art sekundäres Kennwort bildet. Wenn sich der Useragent-Hash bei der nächsten Anmeldung erheblich unterscheidet, wird der Benutzer aufgefordert, die Sicherheitsfrage zu beantworten. Wenn dies zufriedenstellend beantwortet wird, wird die neue UA-Zeichenfolge gehasht und zu ihrer Liste "sichere Maschinen" hinzugefügt, damit sie nicht erneut von dieser Maschine gefragt werden. Dies ähnelt einem Mechanismus, der vom Steam-Spielesystem verwendet wird.

Dies wird seit über einem Jahr mit etwa 700 Benutzern sehr erfolgreich verwendet und hatte den zusätzlichen Vorteil, dass die "Anmeldung freigegeben" wurde - ein Problem, bei dem mehrere Benutzer aus Bequemlichkeitsgründen dieselben Anmeldeinformationen verwendeten!

Dave
quelle
Der Benutzeragent wird vom Angreifer gesteuert. Wenn sich ein Angreifer in einem offenen WLAN-Netzwerk befindet, kann er den Datenverkehr abhören, die vollständige Sitzungs-ID sowie den aktuellen Benutzeragenten abrufen. Haben Sie von den OWASP Top 10 gehört?
Turm
Nichts als HTTPS verhindert MITM-Angriffe. In der Frage wurde gefragt, welche Maßnahmen zur Verbesserung der Sicherheit ergriffen werden können, ohne einen dedizierten Angriff zu stoppen. Das Muster, das dem Verhalten eines Benutzers entspricht, stellt eine zusätzliche Sicherheitsebene dar. Ein gelegentlicher Hacker müsste die UA-Zeichenfolge des legitimen Benutzers erraten, um sie zu fälschen, oder sich einer Sicherheitsfrage stellen.
Dave
Was dieser Beitrag beschreibt, ist die Sicherheit des Frachtkultes, und die einzige Person, die er täuscht, ist der Programmierer.
Turm
@Rook kannst du eine Erklärung hinzufügen, warum du denkst, dass dies Frachtkult ist? Steam setzt sehr auf diesen Mechanismus und hat, wie ich bereits erklärt habe, ein sehr reales Problem der Login-Freigabe in meinem Unternehmen gelöst.
Dave
1
Sie ziehen jedoch nur MITM-Angriffe in Betracht, bei denen ein Angreifer Zugriff und das erforderliche Wissen hat, um die Benutzersitzung zu gefährden. Meine Lösung besteht darin, den Verlust von Passwörtern an andere Dritte als den legitimen Benutzer zu verringern. Dies ist eine weitaus häufigere Form von Sicherheitsverletzungen, und in Ihrem Kommentar geht es um ein anderes Sicherheitsproblem als das, das ich zu verhindern versuche.
Dave
-2

Die Antwort ist kürzer, und wenn Sie wirklich Wert auf Sicherheit legen, haben Sie immer Optionen auf verschiedenen Ebenen der Bürokratie.

Absolute Sicherheit gibt es nicht. Die Nummer eins Fehler ist immer auf der Client - Seite, mit Trojanern ans Keyloggern . SSL hilft dabei nicht.

1) Token-Generatoren : Banken verwenden sie, Blizzard verwendet sie dann. Es kann ein Gerät oder eine App sein. Nun ... es ist teuer.

2) SMS-Pins . interessante und erschwingliche Lösung. Es gibt viele gute Preise für SMS auf dem Markt und jeder hat ein Telefon, das sie empfangen kann.

3) Wenn Sie HTTP verwenden müssen, können Sie einen Drittanbieter-Dienst wie Google oder Facebook erzwingen . Das ist das Beste, was Sie ohne einen Token-Generator tun können.

Guilherme Viebig
quelle
-3

Verwenden Sie Hashing-Mechanismen, um das Passwort zu speichern und das Hash-Passwort immer zu vergleichen. Dann kennt niemand das echte Passwort, auch Sie nicht. Es ist sehr einfach, aber es ist effektiv. Nichts ist jedoch völlig sicher und es gibt einige Möglichkeiten, die Reinheitsschichten aufzubrechen.

Abi
quelle
Ihre Antwort ist zwar nicht falsch, beantwortet aber die Frage nicht. Das Problem hierbei ist, wie das Kennwort sicher auf den Server übertragen werden kann.
Martinstoeckli
@martinstoeckli: Nicht unbedingt. Ein Passwort nur zur einmaligen Verwendung kann per E-Mail oder SMS gesendet werden. Dies könnte tatsächlich für jede Anfrage verwendet werden.
Sentinel
@Sentinel - Das Passwort-Hashing wird serverseitig durchgeführt, sodass ein Angreifer die echten Passwörter nicht erhalten kann, wenn er die gespeicherten Hashes erhält. Wenn Sie dem Benutzer ein einmaliges Token pro SMS senden, ist die Berechnung einer Hash-Client-Seite nicht vorteilhaft. Ein ManInTheMiddle könnte einfach den Hash verwenden, und selbst wenn er den ursprünglichen Token kennt, könnte er ihn nicht wiederverwenden.
Martinstoeckli
-3

Wenn Sie HTTPS nicht verwenden können oder HTTPS nicht verwenden möchten, sollten Sie jCryption verwenden . jCryption bietet Verschlüsselung für die Daten, die über HTTP-Anforderungen (POST, GET usw.) gesendet werden.

Sie können die Technik hier testen: http://www.jcryption.org/#examples

Wenn Sie Firebug verwenden, werden Sie feststellen, dass alle Daten verschlüsselt sind.

Es verfügt über eine jQuery-Bibliothek zum Verschlüsseln der Daten im Front-End und eine PHP-Bibliothek zum Entschlüsseln der Daten im Back-End.

Wissam El-Kik
quelle
1
JavaScript kann nicht verwendet werden, um eine sichere Transportschicht zu erstellen: matasano.com/articles/javascript-cryptography
Turm
Ich stimme voll und ganz zu, dass es nicht 100% sicher ist, aber jCryption basiert auf OpenSSL und mehreren Handshake-Methoden. Alle über eine HTTP-Anforderung gesendeten Daten werden verschlüsselt: Die Schlüssel und Werte werden vollständig geändert / zusammengeführt usw. Für die Verschlüsselung werden RSA und AES verwendet, und Sie müssen einen öffentlichen und einen privaten Schlüssel generieren, um jCryption verwenden zu können. Klicken Sie hier, um zu überprüfen, wie es funktioniert
Wissam El-Kik
-4

Versuchen Sie Folgendes: Senden Sie bei jeder Anforderung der Anmeldeseite eine Nonce und einen Zeitstempel. Senden Sie beim Posten auf dem Server die folgenden vier Details:

Der Benutzername, das Nonce und der Zeitstempel im Klartext. Verketten Sie dann das Obige mit einem Trennzeichen (z. B. newline) und verschlüsseln Sie es mit dem Kennwort des Benutzers als Verschlüsselung im Chained-Block-Cipher-Modus.

Verwenden Sie auf der Serverseite den Benutzernamen, um das Kennwort zu suchen und die verschlüsselte Zeichenfolge zu überprüfen.

Da das Passwort niemals eindeutig übermittelt wird, ist es sicher und der Zeitstempel kann verwendet werden, um eine erneute Übermittlung derselben Daten zu vermeiden.

Um eine Entführung der Sitzung durch Abrufen des Sitzungsschlüssels durch einen Man-in-the-Middle-Angriff zu vermeiden, kann das Kennwort oder ein Hash des Kennworts von der Anwendung auf der Clientseite im Speicher gespeichert und zum Generieren eindeutiger Sitzungsschlüssel verwendet werden zur Validierung durch den Server.

Ein Blick auf OAuth 1.0 ist ebenfalls keine schlechte Idee.

Ravindra HV
quelle
1
Meine Antwort war, das Login sicher zu machen. Es wird also bereits erwartet, dass der Benutzer das Passwort kennt.
Ravindra HV
Ich denke, die Verwendung eines mit dem Passwort gehashten Zeitstempels ist eine interessante Idee, vorausgesetzt, Server und Browser sind zeitsynchron. Ich bin mir nicht sicher, warum dies abgelehnt wurde.
Dave
@MaartenBodewes - Bis zu dem Zeitpunkt, an dem Javascript Zugriff auf den Truststore des Browsers hat und https auf Anwendungsebene implementiert werden kann, besteht die einzige verbleibende Option darin, eine unabhängige Schnittstelle für https bereitzustellen, um das Kennwort zurückzusetzen.
Ravindra HV
Ich habe dies jetzt abgelehnt, weil es lediglich anzeigt, dass Sie etwas verschlüsseln müssen, ohne zu erklären, wie das gemeinsame Geheimnis kommuniziert oder berechnet wird. Dies ist kein Protokoll, sondern eine Reihe interessanter Ideen. Vielleicht ist es auf lange Sicht nützlich, aber es beantwortet die Frage nicht.
Maarten Bodewes
-4

Es ist schwierig , die Kommunikation ohne ein zu sichern. Es trusted third partygibt jedoch einige Sicherheitstricks für Sie:

Setzen Sie die vertraulichen Informationen der Benutzer NICHT einem öffentlichen Netzwerk aus.

Alle vertraulichen Informationen sollten gut gehasht oder mit öffentlichen Schlüsseln verschlüsselt sein. Passt auf: Wenn Sie die vertraulichen Informationen der Benutzer mit einem öffentlichen Schlüssel verschlüsseln möchten, stellen Sie bitte sicher, dass der Benutzer den öffentlichen Schlüssel überprüfen kann. Sie können dem Benutzer beispielsweise eine Art Fingerabdruck mit öffentlichem Schlüssel per SMS oder sogar per automatischem Anruf senden.

Generieren Sie nach erfolgreicher Anmeldung ein SHARED SECRET

Nach einer sicheren Anmeldetransaktion sollte ein gemeinsames Geheimnis generiert werden. Das Generierungsverfahren könnte sich beziehen SSL Handshake. Achtung: Sobald das gemeinsame Geheimnis generiert ist, muss es weiter transportiert werden. Die einzige Funktion besteht darin, die Daten zwischen Serverund zu verschlüsseln / zu entschlüsselnBroswer

Es sollte eine Bestätigung in zwei Schritten erfolgen, um wiederholte Angriffe zu vermeiden

Mögen diese Tricks Ihnen helfen

user3024431
quelle