Im Allgemeinen sind SharedPreferences die beste Wahl zum Speichern von Einstellungen. Im Allgemeinen würde ich diesen Ansatz zum Speichern von Anwendungs- und Benutzereinstellungen empfehlen.
Das einzige Problem ist, was Sie sparen. Das Speichern von Passwörtern ist immer schwierig, und ich würde sie besonders vorsichtig als Klartext speichern. Die Android-Architektur ist so konzipiert, dass die SharedPreferences Ihrer Anwendung in einer Sandbox gespeichert sind, um zu verhindern, dass andere Anwendungen auf die Werte zugreifen können, sodass dort eine gewisse Sicherheit besteht. Der physische Zugriff auf ein Telefon kann jedoch möglicherweise den Zugriff auf die Werte ermöglichen.
Wenn möglich, würde ich in Betracht ziehen, den Server so zu ändern, dass ein ausgehandeltes Token für die Bereitstellung des Zugriffs verwendet wird, beispielsweise OAuth . Alternativ müssen Sie möglicherweise eine Art kryptografischen Speicher erstellen, obwohl dies nicht trivial ist. Stellen Sie zumindest sicher, dass Sie das Kennwort verschlüsseln, bevor Sie es auf die Festplatte schreiben.
MODE_PRIVATE
Ist die Verwendung mit SharedPreferences gleichbedeutend mit der Verwendung einer im internen Speicher erstellten Datei, um lokal gespeicherte Daten zu verschleiern?Ich stimme Reto und fiXedd zu. Objektiv gesehen macht es wenig Sinn, viel Zeit und Mühe in die Verschlüsselung von Passwörtern in SharedPreferences zu investieren, da jeder Angreifer, der Zugriff auf Ihre Einstellungsdatei hat, wahrscheinlich auch auf die Binärdatei Ihrer Anwendung und damit auf die Schlüssel zum Entschlüsseln der Kennwörter zugreifen kann Passwort.
Allerdings scheint es eine Werbeinitiative zu geben, die mobile Anwendungen identifiziert, die ihre Passwörter in SharedPreferences im Klartext speichern, und diese Anwendungen ungünstig beleuchtet. Einige Beispiele finden Sie unter http://blogs.wsj.com/digits/2011/06/08/some-top-apps-put-data-at-risk/ und http://viaforensics.com/appwatchdog .
Wir brauchen zwar mehr Aufmerksamkeit für die Sicherheit im Allgemeinen, aber ich würde argumentieren, dass diese Art der Aufmerksamkeit für dieses eine spezielle Thema unsere Gesamtsicherheit nicht wesentlich erhöht. Da die Wahrnehmungen jedoch so sind, wie sie sind, finden Sie hier eine Lösung zum Verschlüsseln der Daten, die Sie in SharedPreferences platzieren.
Wickeln Sie einfach Ihr eigenes SharedPreferences-Objekt in dieses ein, und alle Daten, die Sie lesen / schreiben, werden automatisch verschlüsselt und entschlüsselt. z.B.
Hier ist der Code für die Klasse:
quelle
Der einfachste Weg, eine einzelne Voreinstellung in einer Android-Aktivität zu speichern, besteht darin, Folgendes zu tun:
Wenn Sie sich Sorgen um die Sicherheit dieser Kennwörter machen, können Sie das Kennwort jederzeit verschlüsseln, bevor Sie es speichern.
quelle
Mit dem von Richard bereitgestellten Snippet können Sie das Passwort verschlüsseln, bevor Sie es speichern. Die Voreinstellungs-API bietet jedoch keine einfache Möglichkeit, den Wert abzufangen und zu verschlüsseln. Sie können das Speichern über einen OnPreferenceChange-Listener blockieren und theoretisch über einen PreferenceChangeListener ändern. Dies führt jedoch zu einer Endlosschleife.
Ich hatte zuvor vorgeschlagen, eine "versteckte" Präferenz hinzuzufügen, um dies zu erreichen. Es ist definitiv nicht der beste Weg. Ich werde zwei weitere Optionen vorstellen, die ich für praktikabler halte.
Das einfachste ist, dass Sie in einem PreferenceChangeListener den eingegebenen Wert abrufen, verschlüsseln und dann in einer alternativen Voreinstellungsdatei speichern können:
Die zweite und jetzt bevorzugte Methode besteht darin, eine eigene benutzerdefinierte Einstellung zu erstellen, indem Sie EditTextPreference erweitern, die Methoden
setText()
und überschreibengetText()
, sodasssetText()
das Kennwort verschlüsselt wird undgetText()
null zurückgegeben wird.quelle
In Ordnung; Es ist schon eine Weile her, dass die Antwort irgendwie gemischt ist, aber hier sind ein paar allgemeine Antworten. Ich habe das wie verrückt recherchiert und es war schwer, eine gute Antwort zu finden
Die MODE_PRIVATE-Methode gilt als allgemein sicher, wenn Sie davon ausgehen, dass der Benutzer das Gerät nicht als Root angemeldet hat. Ihre Daten werden im Klartext in einem Teil des Dateisystems gespeichert, auf den nur das ursprüngliche Programm zugreifen kann. Dies erleichtert das Abrufen des Kennworts mit einer anderen App auf einem gerooteten Gerät. Möchten Sie gerootete Geräte unterstützen?
AES ist immer noch die beste Verschlüsselung, die Sie durchführen können. Denken Sie daran, dies nachzuschlagen, wenn Sie eine neue Implementierung starten, wenn es eine Weile her ist, seit ich dies veröffentlicht habe. Das größte Problem dabei ist "Was tun mit dem Verschlüsselungsschlüssel?"
Jetzt sind wir also bei "Was tun mit dem Schlüssel?" Portion. Das ist der schwierige Teil. Es stellt sich heraus, dass es nicht so schlimm ist, den Schlüssel zu bekommen. Sie können eine Schlüsselableitungsfunktion verwenden, um ein Kennwort zu verwenden und es zu einem ziemlich sicheren Schlüssel zu machen. Sie haben Probleme wie "Wie viele Durchgänge machen Sie mit PKFDF2?", Aber das ist ein anderes Thema
Im Idealfall speichern Sie den AES-Schlüssel außerhalb des Geräts. Sie müssen jedoch einen guten Weg finden, um den Schlüssel sicher, zuverlässig und sicher vom Server abzurufen
Sie haben eine Art Anmeldesequenz (sogar die ursprüngliche Anmeldesequenz, die Sie für den Fernzugriff ausführen). Sie können zwei Durchläufe Ihres Schlüsselgenerators mit demselben Kennwort ausführen. Dies funktioniert so, dass Sie den Schlüssel zweimal mit einem neuen Salt und einem neuen sicheren Initialisierungsvektor ableiten. Sie speichern eines dieser generierten Kennwörter auf dem Gerät und verwenden das zweite Kennwort als AES-Schlüssel.
Wenn Sie sich anmelden, leiten Sie den Schlüssel bei der lokalen Anmeldung erneut ab und vergleichen ihn mit dem gespeicherten Schlüssel. Sobald dies erledigt ist, verwenden Sie den Ableitungsschlüssel Nr. 2 für AES.
Sie können viele Variationen davon machen. Beispielsweise können Sie anstelle einer vollständigen Anmeldesequenz eine schnelle PIN (abgeleitet) eingeben. Die schnelle PIN ist möglicherweise nicht so sicher wie eine vollständige Anmeldesequenz, aber um ein Vielfaches sicherer als einfacher Text
quelle
Ich weiß, dass dies ein bisschen Nekromantie ist, aber Sie sollten den Android AccountManager verwenden . Es wurde speziell für dieses Szenario entwickelt. Es ist etwas umständlich, aber eines der Dinge, die es tut, ist, die lokalen Anmeldeinformationen ungültig zu machen, wenn sich die SIM-Karte ändert. Wenn also jemand Ihr Telefon klaut und eine neue SIM-Karte hineinwirft, werden Ihre Anmeldeinformationen nicht gefährdet.
Dies gibt dem Benutzer auch eine schnelle und einfache Möglichkeit, von einem Ort aus auf die gespeicherten Anmeldeinformationen für jedes Konto auf dem Gerät zuzugreifen (und diese möglicherweise zu löschen).
SampleSyncAdapter ist ein Beispiel, das gespeicherte Kontoanmeldeinformationen verwendet.
quelle
Ich werde meinen Hut in den Ring werfen, um über das Sichern von Passwörtern im Allgemeinen auf Android zu sprechen. Unter Android sollte die Gerätebinärdatei als kompromittiert betrachtet werden. Dies gilt auch für alle Endanwendungen, die direkt vom Benutzer gesteuert werden. Konzeptionell könnte ein Hacker den erforderlichen Zugriff auf die Binärdatei verwenden, um sie zu dekompilieren und Ihre verschlüsselten Passwörter usw. auszurotten.
Daher gibt es zwei Vorschläge, die ich gerne veröffentlichen möchte, wenn die Sicherheit für Sie ein wichtiges Anliegen ist:
1) Speichern Sie nicht das tatsächliche Passwort. Speichern Sie ein gewährtes Zugriffstoken und verwenden Sie das Zugriffstoken und die Signatur des Telefons, um die Sitzungsserverseite zu authentifizieren. Dies hat den Vorteil, dass Sie das Token auf eine begrenzte Dauer beschränken können, das ursprüngliche Kennwort nicht gefährden und über eine gute Signatur verfügen, mit der Sie später mit dem Datenverkehr korrelieren können (um beispielsweise nach Eindringversuchen zu suchen und das Token ungültig zu machen Token, der es unbrauchbar macht).
2) Verwenden Sie die 2-Faktor-Authentifizierung. Dies mag ärgerlicher und aufdringlicher sein, ist jedoch in einigen Compliance-Situationen unvermeidbar.
quelle
Sie können sich auch diese kleine Bibliothek ansehen, die die von Ihnen erwähnte Funktionalität enthält.
https://github.com/kovmarci86/android-secure-preferences
Es ist ähnlich wie bei einigen anderen Ansätzen hier. Hoffnung hilft :)
quelle
Dies ist eine ergänzende Antwort für diejenigen, die aufgrund des Fragentitels hierher kommen (wie ich) und sich nicht mit den Sicherheitsproblemen im Zusammenhang mit dem Speichern von Passwörtern befassen müssen.
So verwenden Sie freigegebene Einstellungen
Benutzereinstellungen werden in der Regel lokal in Android
SharedPreferences
mit einem Schlüssel-Wert-Paar gespeichert . Sie verwenden dieString
Schlüssel speichern oder suchen Sie den zugehörigen Wert.Schreiben Sie in die freigegebenen Einstellungen
Verwenden Sie
apply()
anstelle voncommit()
zum Speichern im Hintergrund und nicht sofort.Lesen Sie aus den freigegebenen Einstellungen
Der Standardwert wird verwendet, wenn der Schlüssel nicht gefunden wird.
Anmerkungen
Anstatt wie oben beschrieben eine lokale Schlüsselzeichenfolge an mehreren Stellen zu verwenden, ist es besser, eine Konstante an einer einzelnen Stelle zu verwenden. Sie können so etwas oben in Ihrer Einstellungsaktivität verwenden:
Ich pflegte , eine
int
in meinem Beispiel, aber Sie können auch verwendenputString()
,putBoolean()
,getString()
,getBoolean()
etc.quelle
Diese Antwort basiert auf einem vorgeschlagenen Ansatz von Mark. Es wird eine benutzerdefinierte Version der EditTextPreference-Klasse erstellt, die zwischen dem in der Ansicht angezeigten Klartext und einer verschlüsselten Version des im Voreinstellungsspeicher gespeicherten Kennworts hin und her konvertiert.
Wie die meisten, die auf diesen Thread geantwortet haben, darauf hingewiesen haben, ist dies keine sehr sichere Technik, obwohl der Sicherheitsgrad teilweise vom verwendeten Verschlüsselungs- / Entschlüsselungscode abhängt. Aber es ist ziemlich einfach und bequem und verhindert das lässigste Schnüffeln.
Hier ist der Code für die benutzerdefinierte EditTextPreference-Klasse:
Dies zeigt, wie es verwendet werden kann - dies ist die "Elemente" -Datei, die die Anzeige der Einstellungen steuert. Beachten Sie, dass es drei normale EditTextPreference-Ansichten und eine der benutzerdefinierten EditPasswordPreference-Ansichten enthält.
Die eigentliche Verschlüsselung / Entschlüsselung bleibt dem Leser als Übung. Ich verwende derzeit Code basierend auf diesem Artikel http://zenu.wordpress.com/2011/09/21/aes-128bit-cross-platform-java-and-c-encryption-compatibility/ , allerdings mit unterschiedlichen Werten für den Schlüssel und den Initialisierungsvektor.
quelle
Zunächst denke ich, dass Benutzerdaten nicht auf dem Telefon gespeichert werden sollten, und wenn Daten irgendwo auf dem Telefon gespeichert werden müssen, sollten sie mit den privaten Daten der Apps verschlüsselt werden. Die Sicherheit der Benutzeranmeldeinformationen sollte die Priorität der Anwendung sein.
Die sensiblen Daten sollten sicher oder gar nicht gespeichert werden. Im Falle einer verlorenen Geräte- oder Malware-Infektion können unsicher gespeicherte Daten gefährdet werden.
quelle
Ich verwende den Android KeyStore, um das Passwort mit RSA im EZB-Modus zu verschlüsseln und es dann in den SharedPreferences zu speichern.
Wenn ich das Passwort zurück haben möchte, lese ich das verschlüsselte aus den SharedPreferences und entschlüssele es mit dem KeyStore.
Mit dieser Methode generieren Sie ein öffentliches / privates Schlüsselpaar, in dem das private sicher gespeichert und von Android verwaltet wird.
Hier ist ein Link dazu: Android KeyStore Tutorial
quelle
Gemeinsame Einstellungen sind der einfachste Weg, um unsere Anwendungsdaten zu speichern. Es ist jedoch möglich, dass jeder unsere gemeinsamen Einstellungsdaten über den Anwendungsmanager löschen kann. Daher denke ich nicht, dass dies für unsere Anwendung völlig sicher ist.
quelle
Sie müssen das SQLite-Sicherheits-Apit verwenden, um die Kennwörter zu speichern. Hier ist das beste Beispiel, in dem Passwörter gespeichert werden. Hier ist der Link für die Quelle und Erklärung - http://code.google.com/p/android-passwordsafe/
quelle