2016-08-09 102 views
0

Ich versuche, ein Hobby/Bildungsprojekt auf den Weg zu bringen, das Benutzerkonten beinhaltet. Natürlich wird es für die Benutzer wichtig sein, sich sicher anmelden zu können. Die Informationen, die ich für Nutzer speichern und transportieren werde, sind nicht dazu gedacht, persönlich oder persönlich identifizierbar zu sein, aber grundsätzlich möchte ich, dass der Passwort-Transport so sicher wie möglich ist.Wie kann ich sicher Benutzerkennwörter ohne HTTPS zum Back-End bekommen?

Ich verstehe, dass der beste Weg, um das Passwort des Benutzers sicher an das Back-End von vorne zu erhalten, ist die Verwendung von HTTPS. Ich möchte jedoch nicht für eine CA für dieses Lern-/Experimentprojekt bezahlen, und ich möchte auch keine Browserwarnungen für selbstsignierte Zertifikate erhalten, denn obwohl dies ein Hobbyprojekt ist, würde ich es gerne teilen es mit der Welt (wie ein Portfolio-Stück, etwas mit Freunden zu teilen, für die Menschen tatsächlich nützlich und Spaß zu finden).

Zugegeben, Sie haben Recht, wenn ich möchte, dass es ein "Portfolio-Stück" ist, sollte ich Best Practices wie HTTPS verwenden, aber ich möchte immer noch keine jährliche CA-Gebühr für was bezahlen Letztlich ist ein Hobby/Lernprojekt.

Ich betrachte die asymmetrische Kryptographie-Lösung hier gefunden: https://github.com/travist/jsencrypt Es ist ganz wie die von ArthuruhtrA vorgeschlagen, und scheint vielversprechend. Es verwendet einen öffentlichen/privaten Schlüssel, sodass ich mit dem öffentlichen Schlüssel am Frontend verschlüsseln und verschlüsselt am Backend mit einem geheimen/privaten Schlüssel entschlüsseln kann (wobei vor dem Speichern in einer Datenbank die richtigen Salting-/Hash-Verfahren verwendet werden) . Scheint das einigermaßen sicher, wenn auch untraditionell?

Gibt es einen anderen, besseren Weg, um Benutzerinformationen (z. B. ein Kennwort) ohne Browserwarnungen und ohne unnötig Geld auszugeben, sicher ans Backend zu senden?

+0

Sie könnten sich einfach in Google Apps hosten - oder in einem anderen Dienst, der bereits über eine SSL –

+0

Hostversion auf AWS Free Tier verfügt, damit ich etwas über AWS erfahren kann. Ich weiß, dass AWS CA-Dienste kostenlos zur Verfügung stellt, aber ich muss herausfinden, ob sie diesen Dienst im Free-Tier anbieten. Selbst wenn dies der Fall wäre, müsste ich das selbstsignierte Cert-Paket durchgehen, um vor der Bereitstellung in AWS lokal zu testen? – Steverino

+1

Mögliches Duplikat von [Login ohne HTTPS, wie sichern?] (Http://stackoverflow.com/questions/2336678/login-without-https-how-to-secure) – SilverlightFox

Antwort

0

Ich weiß nicht, was die beste Antwort darauf ist. Offensichtlich haben Sie überlegt, ein selbstsigniertes Zertifikat zu verwenden. Ich kann mich irren, aber je nach Betriebssystem und Browser können Sie ihm möglicherweise sagen, dass er vertrauenswürdig ist.

Eine andere Lösung könnte sein, das Prinzip der asymmetrischen Kryptographie hinter HTTPS zu verwenden, aber ohne SSL zu verwenden: Fügen Sie den öffentlichen Schlüssel Ihres Servers in Ihre Webseite ein. Verwenden Sie Javascript, um die Daten damit zu verschlüsseln. Ihr Server wäre dann in der Lage, sie mit seinem privaten Schlüssel zu entschlüsseln, ohne dass ein Zwischenhändler dies tun könnte.

Hoffe, dass hilft! Wenn ich mir etwas anderes einfallen lasse, füge ich es hier hinzu.

Edit: Auf den zweiten Gedanken wäre diese Lösung sehr anfällig für einen Man-in-the-Middle-Angriff. Es tut uns leid.

+0

Ich mag die asymmetrische Kryptographie-Antwort.Ich habe eine ähnliche Lösung gefunden, die mich glücklich macht. Ist das so sicher wie HTTPS, wenn nicht üblich? – Steverino

+0

Oh absolut nicht. Es wäre super einfach, einen Man-in-the-Middle-Angriff zu benutzen, um die Verbindung abzufangen und deinen Schlüssel durch seinen zu ersetzen. Dann konnte er die Daten lesen und mit Ihren Daten neu verschlüsseln, so dass niemand merkt. Sie müssen wissen, dass der Benutzer im Voraus über den richtigen Schlüssel verfügte, oder er konnte mit einer Zertifizierungsstelle bestätigen, dass der JavaScript-Code nicht manipuliert wurde. Wenn Sie so etwas verwenden, müsste es eine Anwendung sein, die nicht von der Site heruntergeladen, sondern vorinstalliert wurde. Auf den zweiten Gedanken ist das eine schreckliche Idee. Obwohl es immer noch besser ist, als Klartext zu senden. – ArthuruhtrA

+0

Wie kann der Man-in-the-Middle die Daten lesen, die mit dem öffentlichen Schlüssel verschlüsselt wurden, wenn er nicht den privaten Schlüssel vom Server hat? Wenn der private und der öffentliche Schlüssel beide im Voraus privat auf dem Server erzeugt werden und der öffentliche Schlüssel mit dem Client JS verteilt wird, könnte ein Man-in-the-Middle Daten abfangen, wäre aber nicht in der Lage, etwas damit zu tun (dh würde nicht nicht entschlüsseln können, oder? Ich würde immer noch alles entschlüsseln, das ich am Backend entschlüssle, um sicherzustellen, dass ich gute Eingaben bekomme, aber mein Ziel ist es, Benutzereingaben (Passwort) während der Übertragung zu schützen. Wäre das nicht möglich? – Steverino

3

Wenn Sie ein verschlüsseltes Kennwort von JavaScript verwenden, kann es nicht sicher sein, da es sich nur um die Anpassung auf der Clientseite handelt, d. H. Es handelt sich nicht um einen vom Browser bereitgestellten Dienst.

Ich würde Ihnen raten, TLS mit einem kostenlosen Zertifikat zu verwenden. Sie sollten sich letsencrypt.org ansehen.

+0

Können Sie es ausarbeiten? Ich verstehe nicht, warum die Verschlüsselung weniger sicher wäre, wenn sie von einer JS-Bibliothek ausgeführt würde, als vom Browser, wenn die JS-Bibliothek selbst vertrauenswürdig ist. Sind JS-Bibliotheken grundsätzlich nicht vertrauenswürdig? – Steverino

+0

Es kann vom Benutzer oder einem schädlichen Plugin geändert werden. Die Bibliotheken selbst sind nicht unzuverlässig, aber wenn Sie sie an die Client-Seite senden, kann sie nicht vollständig vertrauenswürdig sein. –

+0

Konnte Malware keine sensiblen Daten abfangen, bevor sie überhaupt transportiert werden, und sie an Dritte senden? Heck, ein Benutzer könnte einen Keylogger unwissentlich installiert haben. Wenn ein Benutzer ein infiziertes System hat, versuche ich nicht, sie davor zu schützen. – Steverino