Frage:
Was ist der beste Weg, um Passwort-Hash über unzuverlässiges TLS zu übertragen?
Igor
2015-01-27 19:59:33 UTC
view on stackexchange narkive permalink

Ich habe eine TLS-Verbindung zwischen meinem Server und dem Client. Ich habe kein Zertifikat, daher ist die Verbindung für den Man-in-the-Middle-Angriff anfällig.

Ich befürchte, dass der Angreifer den Kennwort-Hash abfangen und ihn zur Authentifizierung in meiner Anwendung verwenden könnte.

Wie kann der Kennwort-Hash am besten übertragen werden? Server Nonce oder Client Nonce verwenden? Und welchen Hashing-Algorithmus soll ich verwenden?

Ich gehe davon aus, dass das genaue Angriffsszenario, über das Sie sich Sorgen machen, lautet: "Ich habe ein Zertifikat selbst signiert und befürchte, dass jemand, der meine Zertifizierungsstelle erhält, sich als mein Server ausgeben und ein MITM bereitstellen kann." Ist das dein Szenario? Oder misstrauen Sie von Natur aus allen Zertifizierungsstellen?
Ist der Kunde eine ordnungsgemäße Anwendung oder eine Website? Im ersten Fall können Sie einfach als Ihre eigene Zertifizierungsstelle fungieren.
Fünf antworten:
Gudradain
2015-01-27 20:10:30 UTC
view on stackexchange narkive permalink

Das kannst du nicht.

Es gibt keine sichere Möglichkeit, es zu übertragen, wenn Sie den Server nicht authentifizieren und keinen sicheren Kanal einrichten können. Wenn Sie den Server nicht authentifizieren können, können Sie nicht sicher sein, ob Sie mit dem Server oder dem Angreifer sprechen. Selbst wenn Sie TLS verwenden, um einen sicheren Kanal einzurichten, schützt es Sie überhaupt nicht, da Sie möglicherweise mit dem Angreifer sprechen, während Sie denken, dass Sie mit dem Server sprechen.

Das Zertifikat ist unerlässlich . Ohne diesen oder einige Kenntnisse des öffentlichen Schlüssels des Servers können Sie nicht sicher sein, dass Sie wirklich mit dem Server kommunizieren, da ein Angreifer als Mann in der Mitte zwischen Ihnen und dem Server fungieren könnte.

TLS verwendet Diffie-Hellman für den Schlüsselaustausch. Wenn Sie sich den Abschnitt Sicherheit auf der Wikipedia-Seite ansehen, finden Sie den folgenden Angriff, für den Sie genau anfällig sind.

In der ursprünglichen Beschreibung ist der Diffie –Hellman-Austausch allein bietet keine Authentifizierung der kommunizierenden Parteien und ist daher anfällig für einen Man-in-the-Middle-Angriff. Mallory kann zwei unterschiedliche Schlüsselaustausche einrichten, einen mit Alice und einen mit Bob, die sich effektiv als Alice für Bob tarnen, und umgekehrt, sodass sie die zwischen ihnen übertragenen Nachrichten entschlüsseln und dann erneut verschlüsseln kann.

Fazit

Sie benötigen ein gültiges Zertifikat, um den Server authentifizieren zu können. Andernfalls sind Sie im mittleren Angriff für Menschen anfällig. Eine einfache Möglichkeit, dies zu erreichen, besteht darin, das Serverzertifikat in Ihre Anwendung aufzunehmen, das auch als Anheften von Zertifikaten bezeichnet wird.

Ich dachte daran, mit den Zeilen "Ditch your unzuiable TLS" zu antworten, aber Sie haben es besser gemacht.
SilverlightFox
2015-01-27 21:54:32 UTC
view on stackexchange narkive permalink

Sie sollten sich mit Anheften von Zertifikaten befassen.

Auf diese Weise können Sie Ihrem selbstsignierten Zertifikat und diesem Serverzertifikat nur von Ihrem Client durch eine gründliche Suche von vertrauen der öffentliche Schlüssel des Zertifikats. Daher wird die Autoritätskette nicht befolgt (wo ein selbstsigniertes Zertifikat herunterfällt), sondern der öffentliche Schlüssel wird von der Clientanwendung als direkt vertrauenswürdig validiert.

Sie sollten sich nicht mit Hashing befassen. oder irgendetwas anderes auf der Anwendungsschicht, da es von Natur aus anfällig für einen MITM-Angriff ist.

Nun, Sie sollten Hash, nur auf der Serverseite und um das Passwort im Speicher statt während der Übertragung zu schützen.
@cpast Es wird normalerweise empfohlen, auf der Clientseite einen Hash zu erstellen, damit das Kennwort überhaupt nicht (verschlüsselt oder auf andere Weise) über das Kabel gesendet wird. In einer idealen Konfiguration sollte der Server das Kennwort eigentlich nie kennen, sondern nur seinen Hash.
+2 für die ersten beiden Absätze, -1 für den letzten Absatz. :) Sie sollten auf jeden Fall Hash-Passwörter verwenden, aber dieses Problem ist orthogonal zu der Notwendigkeit, zu überprüfen, ob der Server wirklich der ist, der er sagt, was durch den Vorschlag in Ihren ersten beiden Absätzen gelöst wird.
@reirab: Der dritte Absatz befasste sich mit dem Sieg über ein MITM. Wenn Sie ein Hash-Passwort über die Netzwerkanwendungsschicht senden, wird das Hash-Passwort effektiv zum Passwort. Ich sage nicht, dass Hashing kein nützliches Konzept ist, wenn das der Eindruck ist, den Sie haben?
Ah, ja, ich hatte den Eindruck, dass Sie sagten, Sie sollten das Anheften von Zertifikaten anstelle des Hashing des Passworts verwenden, anstatt es zusätzlich zu verwenden. Das Hashing des Kennworts verhindert natürlich keine MITM-Angriffe, aber es verhindert, dass jemand (einschließlich autorisierter Administratoren auf dem Server) Ihr ursprüngliches Kennwort findet, das an anderen Stellen verwendet werden kann (vorausgesetzt natürlich, dass der Hash gesalzen ist).
@reirab Nein, es wird fast immer empfohlen, auf der Serverseite zu hashen. Sie müssen ohnehin immer auf der Serverseite hashen, da sonst der Hash * Ihr Passwort ist * und ein Kompromiss der Datenbank Ihre Site-Anmeldeinformationen gefährdet. Der Server erhält das Kennwort und überprüft es sofort. Kein Administrator kann dieses Kennwort sehen, es sei denn, er ändert den Code der Webseite, um das Kennwort an anderer Stelle zu speichern.
Wenn sie jedoch in der Lage sind, Servercode zu ändern, können sie auch eine ganze Reihe anderer Dinge tun. Da die Anwendung beispielsweise das Salt vom Server abrufen muss, kann jemand, der den Servercode ändert, stattdessen ein festes Salt für alle senden des echten Salzes), ernten Sie die Hashes und haben Sie dann eine im Wesentlichen ungesalzene Liste von Hashes, die für eine Vorberechnung anfällig sind.
Steve Sether
2015-01-27 21:47:40 UTC
view on stackexchange narkive permalink

Bündeln Sie Ihr selbst erstelltes Stammzertifizierungsstellenzertifikat mit Ihrer Anwendung und konfigurieren Sie es so, dass alle nicht vertrauenswürdigen Zertifikate abgelehnt werden. Wenn Sie nur Ihr eigenes CA-Zertifikat verwenden, ist dies wahrscheinlich sicherer als das Verlassen auf die normalen CAs, da CAs in der Vergangenheit von Angreifern kompromittiert wurden und auch Regierungsbehörden und der Politik unterliegen.

Das Rolling Ihres eigenen Authentifizierungsschemas ist tollkühn und garantiert weniger sicher als die einfache Verwendung von TLS mit einem gebündelten Zertifikat.

Tatsächlich. Erkennen Sie Ihr eigenes Stammzertifikat. Wenn Sie das Zertifikat, die Vertrauenskette oder nicht eines anderen erhalten, lehnen Sie es SOFORT als ungültig ab. Keine Bypass-Option. (Oh, und setzen Sie das Ablaufdatum für das Stammzertifikat auf den höchstzulässigen Wert im X509-Format.)
Kann ich dieses Zertifikat widerrufen und erneut ausstellen, wenn es kompromittiert wird?
@Igor Ja, aber Sie müssen die Sperrliste in das Zertifikat einfügen, wenn Sie es erstellen, und Sie müssen die Unterstützung für die Sperrung von Zertifikaten in Ihre App einfügen http://blog.didierstevens.com/2013/05/08/howto-make- Ihre eigene Zertifikats- und Widerrufsliste mit openssl /
Rahil Arora
2015-01-28 15:24:04 UTC
view on stackexchange narkive permalink

Da andere bereits über die TLS-Authentifizierung gesprochen haben und was in Bezug auf dieses Problem getan werden kann, werde ich mich nur auf Folgendes konzentrieren:

Was ist der beste Weg, um Passwort-Hash zu übertragen?

MITM ist eine der Bedrohungen in Ihrem Szenario. Eine weitere mögliche (auch sehr häufige) Bedrohung ist eine Datenverletzung. Sie müssen den Fall berücksichtigen, in dem Ihre Datenbank möglicherweise gefährdet ist, und müssen auch auf der Serverseite die erforderlichen Vorsichtsmaßnahmen treffen. Das Hashing von Passwörtern auf der Clientseite ist keine sehr gute Idee, es sei denn, Sie vertrauen dem Server Ihre Passwörter nicht an und Sie haschen sie erneut auf dem Server. Ich denke, dass dies bei Ihrem Szenario nicht der Fall ist, da der Server Ihr eigener ist.

Wenn die von den Clients gesendeten Kennwort-Hashes unverändert in der Datenbank gespeichert werden, kann sich ein Angreifer als alle Benutzer ausgeben, indem er dem Server die gehashten Kennwörter unverändert aus der Datenbank sendet. Hashed Passwörter dienen in diesem Fall lediglich als geheime Zugriffstoken . Lesen Sie dies für weitere Details.

Und welchen Hashing-Algorithmus sollte ich verwenden?

Einige gute Hashing-Funktionen (zum Speichern von Passwörtern) auf dem Server) umfassen bcrypt, scrypt und PBKDF2. Schauen Sie sich Thomas Pornins großartige Antwort an, warum diese besser sind. Grundsätzlich erschweren diese Funktionen bei ordnungsgemäßer Verwendung die Aufgabe eines Angreifers im Falle einer Datenverletzung erheblich.

"Das Hashing von Passwörtern auf der Clientseite ist keine sehr gute Idee ..." "Können Sie diese Behauptung erläutern? In welchem ​​Szenario hat das Hashing auf der Clientseite einen Nachteil? Welche Notwendigkeit muss der Server überhaupt haben, um das Kennwort eines Benutzers zu kennen? Das Übertragen des Kennworts an den Server, auch verschlüsselt, eröffnet immer noch mehr mögliche Vektoren für die Gefährdung des Kennworts. Welcher Nutzen gleicht diesen Nachteil aus?
@reirab: Der Link in meiner Antwort macht das schon (hat meine Antwort sowieso bearbeitet :-)). Wenn die Hash-Passwort-Datenbank kompromittiert ist (im Fall von * nur * clientseitigem Hashing), fungieren diese Hashes lediglich als Zugriffstoken. Diese Token können dann zur Authentifizierung bei der Anwendung verwendet werden.
Die am besten bewertete Antwort in Ihrem Link empfiehlt Hashing auf beiden Seiten ...
Ja. Tatsächlich. Der Punkt ist, Sie müssen auf der Serverseite Hash, egal was passiert. Da das OP um Empfehlungen zu Hash-Funktionen gebeten hat, habe ich dies in meine Antwort aufgenommen (da andere Antworten dies nicht abdeckten).
Ángel
2015-01-28 22:26:33 UTC
view on stackexchange narkive permalink

Verwenden Sie den SRP -Mechanismus ( S ecure R emote P assword) von TLS.

Der Client und der Server authentifizieren sich gegenseitig basierend auf der Kenntnis eines freigegebenen Kennworts, das niemals gesendet wird (dies bedeutet, dass alles, was Sie als Kennwort verwenden - in diesem Fall der Hash - vom Server im Klartext gespeichert werden muss).



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...