2016-07-28 20 views
0

So weiß ich, gibt es andere Beiträge in Bezug auf Passwort-Speicherung und Verschlüsselung, aber meine Frage ist etwas anders. So nackt mit mir bis zum Ende.Dkrypt ein Passwort, ohne nach Master-Passwort zu fragen

Ich arbeite an einer Passwort-Manager-Website, zum Spaß. Und fragte sich, wie sicher diese Idee war, die ich hatte.

So offensichtlich jedes Passwort speichert der Benutzer verschlüsselt wird AES-256 mit ihrem Master-Passwort als Schlüssel und ein zufällig erzeugten Salz. Auch das Master-Passwort wird mit Bcrypt verschlüsselt, aber vorher wird es etwa 100.000 mal mit etwas wie einem Whirlpool gehashed, um die Belastung beim Login zu erhöhen.

Wenn ein Benutzer entscheidet, dass er nicht jedes Mal sein Passwort eingeben muss, wenn er ein Passwort für eine Site anfordert, kann das Programm das Passwort nicht entschlüsseln und automatisch ausfüllen, da das Master-Passwort zum Entschlüsseln der gespeicherten Passwörter benötigt wird.

Eine Idee, die ich hatte, war das Passwort in der aktuellen Sitzung des Benutzers zu speichern, aber das ist nicht wirklich eine gute Idee, weil ich versuche, dies unter der Annahme, dass der Angreifer bereits meinen Server durchbrochen hat und die Datenbank herunterlädt und herumschnüffelt.

Ein andere war allerdings das 100.000 Mal Hash-Passwort als Schlüssel für die AES-256-Verschlüsselung zu verwenden und diese Hash in der Sitzung zu speichern. Das ist besser als das Speichern im Klartext, aber der Angreifer kann die gespeicherten Passwörter dennoch entschlüsseln, wenn er die Informationen aus der Sitzung abrufen kann.

Gibt es bessere Möglichkeiten, oder ist dies ein verlorener Kampf der Hoffnung, in den der Angreifer nicht reinkommt, wenn ich eingeloggt bin?

+0

Verwenden Sie ein temporäres Token, anstatt Hashwerte oder Kennwörter zu übergeben. – dandavis

Antwort

0

Wenn Sie die volle Sicherheit wünschen, sollten die Passwörter so gespeichert werden, dass nicht einmal der Server sie ohne Benutzereingaben entschlüsseln kann und somit der Hauptschlüssel nur clientseitig gespeichert wird.

Da Sie nicht wollen, dass es in der Sitzung gespeichert wird, können Sie es in einer Cookie-Client-Seite speichern, aber die Quintessenz ist, wenn ein Eindringling Ihren Server verletzt hat und seinen Code für die Site ändern kann Um funktional zu sein, müssen sie per Definition in der Lage sein, die Passwörter zu erhalten, wenn die Entschlüsselung der Passwörter serverseitig erfolgt.

Also, wenn Sie bereit waren, könnten Sie eine Javascript/Client-Seite Anwendung, die die AES-verschlüsselten Zeichenfolgen für einen bestimmten Benutzer erhalten würde, und entschlüsseln es Client-Seite mit den Benutzern eingegeben Master-Passwort. Das Problem dabei ist, dass Sie eine sekundäre Information haben müssen, bevor Sie einem Benutzer seine verschlüsselten Passwörter geben, oder Sie müssen bereit sein, jedem zu geben, jeder hat ein verschlüsseltes Passwort, wenn er es anfordert.Es gibt eine zusätzliche versteckte Komplexität hier, wenn Ihr Eindringling in der Lage ist, den Code auf dem Server zu ändern, könnte es theoretisch von der Clientseite zur laufenden Serverseite wechseln und somit diese entschlüsselten Passwörter erhalten, oder sie könnten das clientseitige Javascript ändern um einen AJAX-Aufruf mit den entschlüsselten Passwörtern zu machen.

auch das Master-Passwort verwendet Bcrypt verschlüsselt, aber vor der Hand ist es etwa 100.000 mal mit so etwas wie Whirlpool, gehasht Belastung zu erhöhen, wenn sie versuchen

anmelden Es gibt keine Notwendigkeit, das heißt, nur Erhöhen Sie Bcrypt's Stärke-Parameter, um die Zeit zu erhöhen, wenn sie versuchen, sich einzuloggen. Bcrypt verfügt über eine integrierte Schlüsselerweiterung.

0

Leider müssen Sie zwischen Sicherheit und Komfort wählen.

Man kann es schwerer machen, an den Schlüssel zu kommen, z.B. Verwenden von hardwarebasierten Lösungen, aber abschließend muss Ihre Anwendung die gespeicherten Kennwörter irgendwann im Klartext abrufen können. Wenn der Angreifer die volle Kontrolle über den Server hat, hindert ihn nichts daran, genau die gleichen Schritte zu unternehmen.

Für ein Höchstmaß an Sicherheit muss nicht einmal der Server in der Lage sein, die gespeicherten Passwörter zu entschlüsseln, und das ist nur möglich, wenn der Schlüssel auf Client-Seite bleibt. Sie können eine App für den Client schreiben und den Server nur zum Speichern des verschlüsselten Passwortspeichers verwenden.

BTW, der BCrypt Algorithmus bereits tut Schlüssel Strecken, daher ist es nicht notwendig ist, zusätzliche Runden von Hashing hinzuzufügen. Die bessere Lösung ist in diesem Fall, den Kostenfaktor zu erhöhen.