Android Passwort sicher speichern

Hallo zusammen,

und zwar wollte ich euch nach einer Sicherheitsstrategie fragen, wie man Passwörter auf einem Android-Gerät speichert. Es gibt zwar zahlreiche Beiträge, aber keiner der mich wirklich überzeugt und scheinbar gibt es auch noch keinen sinnvollen Ansatz.

Angenommenes Szenario: Für alle Android-Clients gibt es ein gemeinsames Basic-Authentication Passwort. Das Passwort muss deswegen im .apk Bundle mitgeliefert werden. Der User vergibt kein Passwort, deshalb gibt es auch auch keine Aufforderung für eine Username- und Passworteingabe. Es wird https verwendet und es handelt sich nicht um sensible Daten, aber es soll sich auch um eine allgemeine Strategie handeln.

Bisherige Ansätze und Vorschläge:

  • SharedPreferences: Hier sollten nur unsensible Daten gespeichert werden, aber keine Passwörter. Ein Angreifer hat durch Rooten des Gerätes vollen Zugriff auf die gespeicherten Werte.
  • AccountManager: Ist für ein solches Szenario nicht passend, da hier kein wirklicher Account angelegt wird. Hier sollte nur ein Account angelegt werden, auf den durch fragen auch andere Apps zugreifen dürfen.
  • OAuth scheidet für ein solches Szenario aus.
  • Programmatische Generierung aus verschiedenen Parametern oder Zufallsgenerierung mit festgelegten Seed, Verschlüsselte Speicherung eines Masterpasswortes, etc.: Es ist möglich durch Reverse Engineeren an den Quellcode einer .apk zu kommen. Es würde zwar eine Hürde darstellen, aber es wäre zu nachvollziehbar.
    • Dem kann man mit "Obfuscatern" wie z.B. ProGuard entgegenwirken. Manche bieten viele Features. Inwieweit diese gut sind oder ausgehebelt werden können, kann ich nicht beurteilen. ProGuard z.B. benennt alle Methoden und Klassen "spartanisch" um und macht damit das Nachvollziehen schwieriger (Class c ... private int a (long b, int c)). Strings allerdings müssen natürlich noch im Klartext vorhanden sein, manche Methoden wie onCreate dürfen nicht unbenannt werden und per Reflection zugegriffene Ressourcen müssen noch im Original vorhanden sein.
  • Entspechende Teile in C/ C++ auslagern: Genau das wäre mein angedachter Ansatz. Die Hürde wäre wesentlich höher. Ein Programm wäre nicht mehr so leicht decompilierbar und verständlich. Der Angreifer müsste kompetenter sein. Natürlich können diese Ressourcen genauso debuggt werden, jedoch ist Assembler Code schwerer zu lesen als Java - Quelltext. Leider kenne ich mich auf diesem Gebiet nicht genug aus. Dieselbe Problematik wird praktisch in CrackMe's angewandt. Bestimmt gibt es hier schon ausgereifte Konzepte, um den Aufwand möglichst zu erhöhen und irgendwelche Packer etc.

Mir geht es nicht um 100%ige Sicherheit, die gibt es nicht v.a. wenn man seine Anwendung auf einem fremden Gerät aus der Hand gibt. Mir geht es hier nur um ein generelles Konzept, wie man den Aufwand möglichst erhöhen kann. Die ganzen Sicherheitsmechanismen lassen sich natürlich kombinieren. ProGuard wird auch definitiv verwendet werden, allerdings fande ich persönlich den Ansatz mit der Auslagerung in C/ C++ am plausibelsten.

Ich bitte um Eure Meinung :)
Jeanne dArk


 
Danke xryan für deine Antwort. Der Artikel ist wirklich interessant. Die große Frage aber lautet wie ich das Passwort in den "hardware-backed credential store" bekomme. Selbst wenn ich es dort sicher ablegen kann, muss ich es auch sicher hinein bekommen. Prinzipiell kann durch RE auch wieder die Speicherung bis zu dem Weg in diesen hardware store nachvollzogen werden.
 
Zurück
Oben