Sie haben keine Sicherheit ohne Authentifizierung
Um es weiter zu erläutern, verwende ich die JCryption API zum Verschlüsseln des Kennworts mit AES. Der über das Netzwerk übertragene Wert lautet also AES (SHA1 (MD5 (einfaches Kennwort)) ))) Jetzt möchte ich MD5 durch Bcryptonly ersetzen. Der Rest der Dinge bleibt unverändert. Dieser Ansatz funktioniert sogar gegen "Man in the Middle Attack" .
Nein, das tut er nicht. Ich kann dies nicht stark genug ausdrücken. Jetzt kann ich Sie möglicherweise nicht davon überzeugen, https zu verwenden (Sie haben möglicherweise nicht einmal eine Wahl), aber ich hoffe, ich kann Sie davon überzeugen, dass es absolut unsicher ist und dass Sie daran glauben Es ist falsch, etwas Sicherheit zu bieten. Wenn Sie gezwungen sind, ohne TLS / SSL voranzukommen, können Sie allen Beteiligten zumindest klar machen, dass das System anfällig ist und als "leicht zu umgehende Wohlfühlsicherheit" bezeichnet werden sollte. Ein Script-Kiddie, der einen MITM-Hotspot bei Ihren lokalen Starbucks ausführt, kann Ihre Benutzer fälschen und Anmeldeinformationen stehlen oder Sitzungen entführen, sodass keine hoch entwickelten Fähigkeiten oder komplexen Angriffe erforderlich sind.
Wenn der Kommunikationskanal unsicher ist, sollten Sie dies tun Ich habe keine Erwartung, dass der von Ihnen gesendete Code der Code ist, der tatsächlich vom Client ausgeführt wird. Es gibt einen Grund, warum es https (sicheres http) heißt, nicht nur httpe (verschlüsseltes http). Sicherheit ist mehr als nur Verschlüsselung. Verschlüsselungskommunikation ohne Authentifizierung ist sinnlos.
Einige Dinge, über die Sie nachdenken sollten:
- Woher wissen Ihre Benutzer ohne https überhaupt, dass sie sich auf Ihrer Anmeldeseite befinden?
li> Woher wissen Sie, dass ein Angreifer die an den Benutzer gesendete Anmeldeseite nicht geändert hat, um ihm eine Klartextkopie der Anmeldeinformationen zu senden, bevor er sie verschlüsselt und an Sie sendet?
Sie versuchen, die zu verschlüsseln Doppelter Hash des Passworts Wie werden Sie den Verschlüsselungsschlüssel sicher übertragen? Was ist, wenn ich zusätzlich zur Verschlüsselung meine eigene benutzerdefinierte Authentifizierung durchführe
So einfach ist das nicht. Das Bootstrapping eines sicheren Kanals über einen unsicheren Kanal ist kein triviales Problem. Theoretisch könnten Sie ein benutzerdefiniertes Protokoll erstellen, das alle Aspekte von https repliziert, einschließlich Protokollverhandlung, Serverauthentifizierung, Infrastruktur öffentlicher Schlüssel, Schlüsselaustausch, Verschlüsselung, Nachrichtenintegrität und Sperrung (und ich bin sicher, dass ich noch viel mehr vergessen habe). Sobald Sie fertig sind, ist es genauso groß und komplex wie TLS. Nehmen wir auch an, es hatte weniger Fehler als jede andere TLS-Implementierung und Sie könnten es in weniger als ein paar Jahren tun, Sie hätten immer noch ein fast unmögliches Problem. Wie bringen Sie diese clientseitigen Komponenten zum Client? "Oh sicher, der Client muss es sicher herunterladen ... ähm, warte". Wenn es einfach erscheint, sichere Kommunikation über einen unsicheren Kanal zu booten, dann haben Sie ehrlich gesagt nicht tief genug geschaut, es sind Schildkröten bis zum Ende.
Lassen Sie mich jetzt klar sein, TLS hat viele Probleme, und das Das CA-System hat auch viele Probleme. Ich werde sicherlich nicht so tun, als wäre es perfekt, aber sichere Kommunikation ist ein solches Henne-Ei-Problem, dass es die beste Lösung ist, die wir haben.
Client-seitiges Hashing kann über https
durchgeführt werden
Aus Ihrer Formulierung geht hervor, dass Sie die Frage als "clientseitiges Hashing ODER serverseitiges Hashing über https" betrachten, aber ich hoffe, Sie können sehen, dass dies ein Trugschluss ist. Sie benötigen https, unabhängig davon, wie Sie Ihre Benutzer authentifizieren. Wenn Sie also akzeptieren, dass Sie https benötigen, lautet die Frage: "Warum oder wann ist es sinnvoll, clientseitiges Hashing (über https) anstelle von serverseitigem Hashing (über https) zu verwenden? In den meisten Fällen ist dies nicht der Fall." Das clientseitige Hashing ist komplexer und nicht sicherer, hat jedoch einen Vorteil: Der Server kennt das Kennwort nicht, was beim serverseitigen Hashing nicht der Fall ist. In einigen Szenarien möchten Sie dies Sie können einen Schlüssel, den Sie nicht haben, nicht verlieren, und Sie können nicht gezwungen werden, die Dateien eines Kunden zu entschlüsseln, wenn er Ihnen nie den Entschlüsselungsschlüssel gegeben hat. Es gibt also Szenarien, in denen dies möglicherweise obligatorisch ist Voraussetzung, aber es sollte Teil des Projektdesigns sein, keine willkürliche Entscheidung. Wenn Sie spezielle Fragen zum Umgang mit Null-Wissensszenarien haben, ist dies besser als neue Frage zu tun.