2008-10-22 11 views
11

Ich erstelle einen Twitter-Client und bewerte die verschiedenen Möglichkeiten zum Schutz der Anmeldeinformationen des Benutzers.Schützen von Benutzerkennwörtern in Desktop-Anwendungen (Rev 2)

WICHTIG: Ich muss die Daten des Benutzers von anderen Anwendungen schützen. Stellen Sie sich zum Beispiel vor, was passiert, wenn ein Bot anfängt, Twhirl-Passwörter oder Hotmail/GMail/Yahoo/Paypal von Anwendungen zu stehlen, die auf dem Desktop des Benutzers laufen.

Klarstellung: Ich fragte dies zuvor ohne den 'wichtigen' Teil, aber die Benutzeroberfläche von stackoverflow hilft nicht beim Hinzufügen von Details später in der Q/A-Konversation.

  • Hashing ist offenbar nicht tun es
  • in einer umkehrbar Weise Verschleiern ist wie der Versuch, hinter meinem Finger
  • Plain Text klingt zu verstecken und propably ist Promiscuous
  • der Benutzer sein Passwort eingeben jedes Mal würde die Anwendung ermüdend machen

Irgendwelche Ideen?

+0

Sie keine Sorge über Man-In-The-Middle-Angriffe erwähnt hat. Es ist trivial für jeden im selben Subnetz, es auszuführen und alle Ihre Kommunikationen abzufangen. – hurst

+0

Wie viel Zeit und Mühe investieren Sie gegen einen Angriff? Es gibt keine perfekte Sicherheit. –

+0

Ich denke, die Frage ist universell. Wenn die beliebtesten Desktop-Mail-Clients, die auf gmail/hotmail zugreifen, dies nicht lösen können, haben wir ein ernstes Problem. – KCorax

Antwort

13

Dies ist ein Catch-22. Entweder Sie geben den Benutzer jedes Mal sein Passwort ein oder Sie speichern es unsicher (verschleiert, verschlüsselt, was auch immer).

Der Weg, um dies zu beheben, ist für mehr Betriebssysteme integrierte Passwort-Manager - wie OS X Schlüsselbund. Auf diese Weise speichern Sie Ihr Passwort einfach im Schlüsselbund, das Betriebssystem schützt es und der Benutzer muss nur ein Master-Passwort eingeben. Viele Anwendungen (wie Skype) unter OS X verwenden Keychain, um genau das zu tun, was Sie beschreiben.

Aber da Sie wahrscheinlich Windows verwenden, würde ich sagen, nur mit etwas Verschleierung und Verschlüsselung gehen. Ich denke, du magst etwas paranoid über die Passwort-stehlenden Bots sein; Wenn Ihre Anwendung keine große Nutzerbasis hat, sind die Chancen ziemlich niedrig, dass jemand sie gezielt anvisiert und versucht, die Passwörter zu stehlen. Außerdem müssten sie auch Zugriff auf das Dateisystem ihres Opfers haben. Wenn das der Fall ist, haben sie wahrscheinlich einen Virus/Wurm und haben größere Probleme.

+0

Verschlüsselung spielt keine große Rolle. Lies die erste Antwort. Keychain ist nicht schlecht, würde auch mindestens einen zusätzlichen Klick erfordern. Ich suche nach etw vorzugsweise transparent. – KCorax

+0

Und wenn sie einen Virus/Wurm haben, dann könnte es Schlüsselprotokollierung sein und ihr Kennwort wird trotzdem gefangen. Du bist hier richtig. – tloach

+0

Erste Antwort? Was meinst du Keychain würde einen zusätzlichen Klick benötigen? – ine

2

Nach weiterer Betrachtung denke ich, dass ich einen Weg gefunden habe. Ich werde ASP.net-Authentifizierung für meine Anwendung Desktop-Anwendung verwenden, ihre Anmeldeinformationen online speichern und Internet Explorer-Kennwort-Manager das lokale Zwischenspeichern dieses sekundären Paares oder Anmeldeinformationen für mich behandeln lassen.

Ich muss nur sie über eine Facebook-API wie Formular beim ersten Login authentifizieren.

5

Ich glaube, Sie vermissen das größere Bild hier:

Wenn der Desktop gefährdet ist, sind Sie # *% ED F!

Um ein Passwort aus Ihrem Programm zu stehlen, müsste ein Virus auf dem System als Administrator ausgeführt werden. Wenn der Virus das erreicht hat, ist das Stehlen von Kennwörtern von Ihrem Programm weit unten auf seiner Liste von bösartigen Dingen, die es tun möchte.

2

Ich verstehe es nicht ... warum ist Verschlüsselung nicht gut? Verwenden Sie einen großen Schlüssel, und speichern Sie den Schlüssel im Computerschlüsselspeicher (unter der Annahme von Windows). Gemacht und gemacht.

+0

Ich denke, dass der Autor sich Sorgen macht, dass jemand Ihre Anwendung zurückentwickeln kann, den Schlüssel wiederherstellen und ihn verwenden kann, um das Passwort zu übernehmen. Dies wird wahrscheinlich nicht mit der Bewerbung des Autors geschehen, es sei denn, es wird mega-riesig. –

+0

Der Schlüssel ist im Maschinenschlüsseldatenspeicher gespeichert. Im Idealfall würde er die App so schreiben, dass sie beim ersten Mal einen zufälligen Schlüssel generiert und speichert. Keine zwei Installationen der Anwendung würden dann den gleichen Schlüssel verwenden. –

+0

@Robert: Wenn die KeyStore-API für meinen Fall (Clickonce-Bereitstellung) funktioniert, würde ich meine Daten lieber direkt dort speichern, anstatt den zusätzlichen Schritt der Verschlüsselung vor dem Speichern durchzuführen. – KCorax

5

Speichern Sie es im Klartext und lassen Sie den Benutzer wissen.

Auf diese Weise gibt es keine Missverständnisse darüber, welches Sicherheitsniveau Sie erreicht haben. Wenn Benutzer sich beschweren, betrachten xor'ing eine Konstante auf Ihrer Website konstant darauf. Wenn Benutzer sich beschweren, "verstecken" Sie die Konstante in Ihrem Code und sagen Sie ihnen, dass die Sicherheit schlecht ist.

Wenn Benutzer nicht schlechte Leute aus der Box halten können, dann in der Tat alle geheimen Daten, die sie haben, ist Dr. Evil bekannt. Es spielt keine Rolle, ob es verschlüsselt ist oder nicht. Und wenn sie die bösen Menschen fern halten können, warum sollten sie sich dann darum sorgen, Passwörter im Klartext zu speichern?

Ich könnte natürlich hier meinen Arsch reden. Gibt es eine Studie, die zeigt, dass das Speichern von Passwörtern im Klartext eine schlechtere Sicherheit bietet, als sie verschleiert zu speichern?

+2

+1 für den Benutzer wissen – guerda

4

Wenn Sie machen ein Twitter-Client dann ihre API verwenden

Twitter hat eine sehr gute documentation, so rate ich Ihnen, es alles lesen, bevor sie eine Client machen. Der wichtigste Teil in Bezug auf diese Frage ist, dass Sie die Kennwörter nicht speichern müssen, sondern das Token OAuth stattdessen speichern. Sie müssen die Stufe xAuth verwenden, um das OAuth-Token abzurufen, und ggf. andere Twitter-APIs mit diesem OAuth-Token verwenden.

xAuth bietet eine Möglichkeit für Desktop- und mobile Anwendungen, einen Benutzernamen und ein Kennwort für ein OAuth-Zugriffstoken auszutauschen. Sobald das Zugriffstoken abgerufen wurde, sollten xAuth-fähige Entwickler über das Login und das Kennwort verfügen, das dem Benutzer entspricht.

Sie speichern niemals Passwörter, wenn Sie mit ihm

bekommen können weg

OAuth Mit dem Schlimmste, das ist eine 3rd-Party (schwarzer Hut Hacker) bekommt Zugang zu diesem Twitter-Account passieren kann, aber nicht die Passwort. Dies schützt Benutzer, die naiv dasselbe Passwort für mehrere Online-Dienste verwenden.

einen Schlüsselbund von einiger Art verwenden

Schließlich stimme ich, dass vorgefertigte Lösungen wie OSX Schlüsselbund sollten die empfindlichen OAuth Informationen, eine kompromittierte Maschine nur die Informationen der aktuell entriegelten offenbaren würde speichern verwendet werden Schlüsselanhänger. Dies bedeutet, dass in einem Mehrbenutzersystem nur die angemeldeten Benutzer ihre Schlüsselbunde anfällig machen.

Andere Schäden Einschränkungen

Es kann Sachen, die ich verpasst habe für „beste Sicherheitspraktiken“ eine Google nehmen und beginnen zu lesen, was von Bedeutung sein können.

EDIT (als Reaktion auf finnw allgemeinen Fall Lösung gewünscht)

Sie wollen, da keine Benutzereingaben, Zugriff auf einen Online-Dienst. Dies bedeutet, dass Sie in der Regel die Zugriffssteuerung auf Benutzerebene für die Authentifizierungsdaten über einen Schlüsselbund haben.

Ich habe noch nie OSX Keychain verwendet, also werde ich jetzt über SELinux sprechen. In SELinux können Sie auch sicherstellen, dass diese Authentifizierungsdaten nur an Ihr Programm übergeben werden. Und wenn wir weiterhin auf Betriebssystemebene arbeiten, könnten Sie auch alle Prozesse vom Start bis zur Verschlüsselung unterschreiben, um sicher zu sein, dass kein anderes Programm Ihr Programm nachahmen kann. Dies ist alles andere als ein typisches Benutzersystem, und angesichts dieses Setup-Niveaus können Sie sicher sein, dass der Benutzer nicht naiv genug ist, um kompromittiert zu werden, oder ein Systemadministrator genug Kompilation hat. Auf dieser Ebene konnten wir diese Anmeldeinformationen schützen.

Nehmen wir an, wir gehen nicht so weit in den Schutz dieser Anmeldeinformationen, dann können wir davon ausgehen, dass das System kompromittiert ist. An diesem Punkt werden die Authentifizierungsdaten kompromittiert, die Verschleierung/Verschlüsselung dieser Anmeldeinformationen auf der lokalen Seite fügt keine echte Sicherheit hinzu und speichert auch keinen oder nur einen Teil davon auf einem Server eines Drittanbieters. Dies ist leicht zu sehen, da Ihr Programm keine Benutzereingaben benötigt, um sich selbst zu laden, um diese Anmeldeinformationen zu erhalten. Wenn Ihr Programm es ohne Eingabe kann, dann kann auch jeder, der Ihr Verschleierungs-/Verschlüsselungs-/Server-Protokoll umgekehrt hat.

An diesem Punkt ist es Schadensbegrenzung, speichern Sie nicht das Passwort als Authentifizierungsdaten. Verwenden Sie OAuth, Cookie-Sitzungen, gesalzene Hashs usw., es sind alles nur Token, die zeigen, dass Sie irgendwann einmal in der Vergangenheit wussten, dass Sie das Passwort kannten. In jedem guten System können diese Token während der aktiven Sitzung widerrufen, die Zeit abgelaufen und/oder periodisch gegen ein neues Token ausgetauscht werden.

Das Token (in welcher Form es auch sein mag) kann auch zusätzliche Authentifizierungsinformationen für Nicht-Benutzereingaben enthalten, die Ihre Fähigkeit einschränken, sie anderweitig zu verwenden. Es könnte zum Beispiel Ihren Hostnamen und/oder Ihre IP-Adresse einkapseln. Dies erschwert die Verwendung der Anmeldeinformationen auf unterschiedlichen Computern, da das Imitieren dieser Anmeldeinformationen den Zugriff auf die entsprechende Netzwerkinfrastruktur erfordert.

0

OSX: Verwenden Sie den Schlüsselanhänger

Fenster: Verwenden CryptProtectData und CryptUnprotectData

Linux: Verwenden Sie GNOME Keyring und KDE KWallet