Password geschützte Activity (Shared Preference)

  • Hallo Zusammen,
    ich habe ein Problem und hoffe ihr könnt mir helfen.
    Ich möchte in meiner Android App einem einem Activity (Activity_Passwort_Abfragen) eine Passwort/Pin-Abfrage implementieren. Über die Action Bar öffnet sich ein zweites Activity (Activity_Passwort_Setzen) in dem das Passwort gesetzt werden kann.
    Ich brauche hierfür etwas was auch nach dem Neustart der App seinen Wert behält. Hier bin ich auf die SharedPreferences gestoßen.
    Hier die Passwort Abfrage:


    In der zweiten Activity soll nun das Passwort durch Knopfdruckt geändert werden:

    Java
    edit.putString("user_pin", user_pin);

    Jedoch wird der Pin jedesmal beim Starten der App überschrieben, da er immer auf den default werd durch die oNCreate-Methode gesetzt wird. Wie kann ich dieses Problem umgehen?
    Gibt es eventuell andere Ansätze?


    Vielen Dank für die Hilfe :)
    Tobi

  • EDIT: Die verschiedenen Bezeichnungen machen mich etwas konfus ... habe mich mit den SharedPreferences noch nicht auseinandergesetzt - user_pin, pin ...
    Gäbe es da nicht die Möglichkeit einer Gleichbenennung? Du musst dann nur darauf achten, dass du die richtige Bezeichnung nutzt :)


    Du könntest in der onCreate-Methode abfragen, ob die (user_)pin leer (bzw. nicht gesetzt) ist.
    Leider habe ich momentan keine Möglichkeit, das zu testen - bitte entschuldige, sollte meine Antwort dir nicht helfen können oder gar inkorrekt sein.


    Ansonsten prüfst du genauso, wie es in der if-Abfrage steht, ob die eingegebene Pin der aus den SharedPreferences gleicht.
    Diese Abfrage folgt dann beim Drücken eines Buttons z.B. - ich weiß ja nicht, ob es da etwas Vorgefertigtes gibt bzw. du das auch nutzt.



    Java
    [...]
    if(pins_pref.getString("user_pin", null).equals(pin_eingabe)) {
        // falls die Eingabe korrekt ist, mache weiter ...
    }
    else {
       // ... ansonsten folgt eine Meldung bspw. (:
    }
    [...]
  • Da kann ich helfen. :)


    Die SharedPreferences sind ein reiner Key-Value-Store.
    Es werden also Werte zu Schlüsseln abgespeichert und ausgelesen.


    Hier gibt es beim Auslesen eigentlich zwei Zustände.

    • Der Schlüssel exisitiert nicht.
      Die Abfrage liefert ein null Objekt zurück.
      Im weiteren Verlauf zu Problemen führen, weshalb es sachdienlich ist, einen sinnvollen Defaultwert beim Auslesen zu setzen.
      (String: "", Ziffer: 0...)
    • Der Schlüssel existiert.
      Du bekommst einen irgendwie gültigen Wert zurück.


    Beim Lesen musst Du beachten, dass Du die gleiche Lesemethode verwendest, wie Du sie zum Schreiben verwendet hast. Und natürlich musst Du denselben Key verwenden. (static const final String kann helfen.)
    Sofern Du also putString("Foo", "Bar") aufrufst, wird ein getBool("Foo") ebenso wenig bringen wie ein getString("Fubar"). ;)


    Obacht
    Den Pin so im Klartext da rein zu werfen ist eine sehr sehr sehr schlechte Idee.
    SharedPreferences sind geteilt und können von potentiellen Angreifern gelesen werden. Damit ist Deine Sicherheitsfunktion hinfällig.
    Lieber ein SHA128 mit dem Salt der Usermail, der aktuellen Telefonnummer oder anderen Dingen, die nicht durch die SharedPreferences ersichtlich sind, ablegen.
    MD5 ist mittlerweile auch unsicher geworden.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!