2008-10-20 5 views
5

Ich baue Authentifizierung in einer Client-Server-Anwendung, und einige der Rückmeldungen, die ich erhalten habe, ist, dass ich die Hash-Berechnung auf den Server verlassen sollte (es wurde ursprünglich implementiert, um den Client den Hash zu erhalten, berechnet einen Hash von das eingegebene Passwort des Kunden, und vergleichen Sie sie). Das scheint Sinn zu machen, aber ich habe noch ein Problem - Wie kann ich Benutzer authentifizieren, die offline sind?Welches ist das beste Modell, um die Benutzerauthentifizierung offline zu schalten?

Wenn ich beispielsweise ein mobiles Gerät ohne Internetzugriff bereitgestellt habe, was ist dann die sicherste Methode zur Authentifizierung?

So wie ich es sehe, werde ich zu haben entweder die Möglichkeit der Client die Hash zu erhalten + jedes Salz Informationen, OR einen separaten Pin/Passwort verwenden und den Client ermöglichen, den Hash + Salz für zu erhalten das Passwort.

Ich würde letzteres bevorzugen, weil es den Angriffsvektor zu begrenzen scheint - wenn ein mobiles Gerät kompromittiert wird, dann bleibt die Sicherheit des gesamten Systems (z. B. aller netzwerkauthentifizierten Stücke) intakt.

Was sind meine besten Optionen und Überlegungen?

+0

Sprechen Sie über dauerhaften Offline-Zugriff oder die erneute Authentifizierung von jemandem, der online war, jetzt, wo sie nicht mehr sind? – Whisk

+0

Das Endziel ist, dass der Client später mit dem Server verbunden wird und seine Daten/Updates synchronisiert. – pc1oad1etter

+0

Entschuldigung für die Verwirrung. Ich meinte kein "Master" -Kennwort, das von allen Benutzern geteilt wird. Ich meinte ein Kennwort, das die mobile Datenbank des Benutzers und die Anmeldeinformationen für die Dienstauthentifizierung des Benutzers schützt. Dies authentifiziert Benutzer effektiv offline und online. – erickson

Antwort

1

Wenn Sie Ihre Anwendung ausführlicher erläutern, stelle ich möglicherweise fest, dass ich hier nicht an der Basis bin, aber für den Moment werde ich einige Annahmen über Ihren Anwendungsfall und Ihr Bedrohungsmodell treffen.

Mein Verständnis ist, dass Sie einige vertrauliche Informationen haben, die Sie zwischen einem mobilen Gerät mit unterbrochener Konnektivität und einem Remote-Dienst synchronisieren möchten. Der Dienst ist nur für authentifizierte Benutzer zugänglich, und Benutzer müssen sich gegenüber dem mobilen Gerät authentifizieren, um auf ihre Kopie der Informationen zugreifen zu können, selbst wenn sie offline ist.

Wenn Sie starke Sicherheit wünschen, verschlüsseln Sie die Kopie des mobilen Geräts mit passwortbasierter Verschlüsselung.

Sie könnten dasselbe Passwort verwenden, das für die Authentifizierung beim Dienst verwendet wird, aber im Allgemeinen würde ich vermeiden, denselben Schlüssel für andere Zwecke zu verwenden. Ein besserer Ansatz wäre ein Hauptverschlüsselungskennwort für das mobile Gerät, das die mobile Datenbank verschlüsselt, sowie das "Kennwort", das zur Authentifizierung des Benutzers beim Synchronisierungsdienst verwendet wird. Beachten Sie, dass das Dienstauthentifizierungskennwort tatsächlich ein privater Schlüssel für die SSL-Client-Zertifikat-Authentifizierung oder ein zeichenbasiertes Kennwort sein kann.

Sie müssen das Risiko eines einzigen Passworts auswerten, aber in vielen Fällen denke ich, dass dies dem Benutzer einen Vorteil bietet, kombiniert mit der Sicherheit eines starken Master-Passworts im Gegensatz zu zwei schwachen, aber leicht zu merkende Passwörter ist eine gute Balance.

Beachten Sie, dass Benutzer, deren Dienstzugriff widerrufen wurde, mit diesem Ansatz weiterhin auf ihre lokale Kopie zugreifen können, jedoch ohne neue Aktualisierungen. Sie könnten eine Vorstellung von einem Zeitlimit enthalten, das von der mobilen Software durchgesetzt werden soll, aber ein entschlossener Angreifer könnte dies umgehen.

Wenn Sie nur Spielzeugsicherheit benötigen, ist Ihr Vorschlag, den richtigen Hash auf dem mobilen Gerät zu speichern, angemessen, und es ist wirklich egal, ob Sie das echte Passwort oder eine Alternative hashen, denn wenn Sie den richtigen Hash verwenden, Es sollte einige Milliarden Jahre dauern, bis eine Passwortkollision gefunden wurde, die es ihnen ermöglichen würde, auf den Remote-Dienst zuzugreifen.

Vorausgesetzt, ein Angreifer kann den Kennwort-Hash sehen, was hindert ihn daran, auch die synchronisierten Daten anzusehen? Warum sollten sie das Passwort wiederherstellen müssen? Eine Verschlüsselung der mobilen Datenbank würde dies verhindern.

+0

P. S., Für die kennwortbasierte Verschlüsselung könnten Sie nach einer Antwort von mir über "PBKDF2" suchen.Fühlen Sie sich frei, mehr Fragen zu stellen, wenn Sie interessiert sind. – erickson

+0

Ich mache mir keine Sorgen wegen der Vertraulichkeit, da ich eine Authentifizierung bin - in dem Wissen, dass die Person, die Daten auf das mobile Gerät überträgt, authentifiziert ist. Es könnte Johnny Authenticated oder Julie Authenticated sein, aber nicht Ursula Unauthenticated. Also würde ich lieber nicht nur ein Master-Passwort haben. – pc1oad1etter

1

Ich denke, es hängt vielleicht von Ihrer Problemdomäne ab, aber für eine sichere Anwendung kann die Autorisierung wegen des fehlenden Vertrauens nicht clientseitig durchgeführt werden. In dem einfachen Fall, in dem Sie angegeben haben, wo die Hash-Berechnung und der Vergleich clientseitig durchgeführt werden, müssen Sie nur einen Debugger starten, den Code durchgehen und herausfinden, wo der Vergleich durchgeführt wird, und einen Wert ersetzen der Stapel kurz vor der Rückkehr (zum Beispiel). Herzlichen Glückwunsch, Sie wurden gehackt.

Ich möchte weitere Informationen darüber erhalten, welche Vorgänge Ihre bestimmte App im "Offline" -Modus aktivieren soll und wie Ihr Plan für die Abstimmung aussehen würde, sobald das Gerät wieder verbunden wird, bevor ich die Aktivierung der Teilfunktion prüfen würde Funktionalität offline.

+0

Sie bestätigen also, dass es auf dem Client nicht vollständig sicher sein kann - was kann ich tun, um Risiken zu minimieren? Ihr letzter Kommentar kommt wahrscheinlich dazu - in Anbetracht dessen, was zu tun oder zu prüfen ist, bevor Daten synchronisiert werden. – pc1oad1etter

+0

Too open ended = x Ich habe keine Ahnung, welche Art von s/w du erstellst, aber betrachte etwas wie das Quellcodeverwaltungsmodell, in dem Offline - Änderungen vorgenommen werden können, aber dann verifiziert/rückgängig gemacht/verglichen werden können Der Server vor den Änderungen wird während einer authentifizierten Serversitzung festgeschrieben. – Niniki

0

Ich habe vor ein paar Minuten eine ähnliche Frage gestellt, und nach einigem Nachdenken hätte ich mit öffentlichen/privaten Schlüsseln vielleicht einen akzeptablen Ansatz gefunden. Hier sind die Schritte, die ich für meine Anwendung skizziert:

  1. Wenn der Benutzer offline geht, er wählen kann ein Passwort verwenden, um Zugriff auf die App zu sichern, während offline (mit optionaler Verschlüsselung zum Schutz gegen Diebstahl).

  2. Nach dem Online-Versand sendet der Client eine ID für den aktuellen Benutzer (es könnte wie ein Hash oder etwas sein, das diesen Benutzer eindeutig identifiziert).

  3. Der Server sendet ein Autorisierungstoken, das mit dem öffentlichen Schlüssel des Benutzers verschlüsselt wurde.

  4. Der Client sendet das entschlüsselte Token mit seinem privaten Schlüssel zurück.

  5. Der Server sendet schließlich ein Sitzungstoken, um die weitere Kommunikation fortzusetzen (dieser letzte Schritt ist möglicherweise nicht erforderlich, vielleicht kann das bereits erstellte Authentifizierungs-Token verwendet werden?).

Ich bin kein Experte auf Verschlüsselung oder Sicherheit, aber es scheint mir, dieser Ansatz ist sehr sicher, da der einzige Weg, ich in den Server hacken denken kann, wäre für den Angreifer die haben Benutzer privater Schlüssel zusammen mit seiner Passphrase. Bei sensiblen Daten kann dies, wie erwähnt, entweder durch ein Passwort geschützt werden, um den Benutzer zu authentifizieren, oder durch eine Verschlüsselung der Daten selbst. Wenn das Gerät verloren geht, wird es nicht kompromittiert .

+0

Ich denke, dass die Schritte 2-5 anwendbar sein könnten, unabhängig davon, ob eine Verbindung zwischengeschaltet wurde oder nicht. Die Frage bezieht sich mehr auf # 1 - Sie schlagen vor, dass der Benutzer ein separates Passwort einstellt, was eine Option ist, die ich in Erwägung ziehe. Die Schritte 2-5 fügen hinzu, dass zumindest die Person, die sich synchronisiert, eine ID erhält. – pc1oad1etter

+0

Ja, in meinem Fall verwende ich eine andere Methode für das Online-Signieren (OpenID), also musste ich diesen Ansatz verwenden, um sowohl die Synchronisierung als auch die Benutzerdaten zu schützen. – Ivan

Verwandte Themen