# Wie funktioniert das mit den Fingerabdruck Login? (Meinung)



## wer112 (1. Apr 2022)

Ich habe lange überlegt. Ich habe wenn man sich eingeloggt hat, die Möglichkeit gegeben, sich mit Fingerabdruck anzumelden.
Um das zu aktivieren, muss man sein Passwort eingeben, wenn das Passwort stimmt, wird es in der Datenbank eingetragen.
Dann lade ich die Benutzerdaten(email und Passwort) entschlüsselt in die App und speichere das verschlüsselt ab.
Wenn man dann auf die Login Seite kommt, und der Fingerabdruck stimmt, wird man mit den gespeicherten Zugangsdaten eingeloggt(vorher entschlüsselt).

Wird das so gemacht oder anderes?

Wie macht man das sicher?

Wie kann ich z.B. das Passwort verschlüsseln und wie entschlüsseln? 
Gibt es da Sichere Methoden?

Könnt ihr eure Meinung sagen, ob ich damit richtig liege, oder ob das unsicher ist und wie ich das in der App aktiviere, da Banking Apps ja das auch in der App aktivieren muss.

Ich freue mich auf eure Meinung.


----------



## temi (2. Apr 2022)

wer112 hat gesagt.:


> Wie kann ich z.B. das Passwort verschlüsseln und wie entschlüsseln?


I.d.R. legt man nicht ein Passwort ab, sondern einen kryptografisch sicheren Hash (allgemein bekanntere Hashfunktionen sind z. B. SHA und MD5) des eingebenen Passworts. Wenn der Benutzer sich anmeldet, wird seine Eingabe ebenfalls gehasht und mit dem gespeicherten Hash verglichen.

Das Passwort kann aus dem gespeicherten Hash nicht rekonstruiert werden (es ist keine Verschlüsselung).

Zur Verschlüsselung gibt es ebenfalls viele verschiedene Algorithmen, z. B. AES

Sowohl für Hashing als auch zur Verschlüsselung gibt es in Java entsprechende Klassen.


----------



## White_Fox (2. Apr 2022)

Ich habe von solcher Art Software keinerlei Ahnung, dennoch zwei Dinge.

Erstens:


wer112 hat gesagt.:


> Dann lade ich die Benutzerdaten(email und Passwort) entschlüsselt in die App und speichere das verschlüsselt ab.


Damit hast du schonmal eine Schwachstelle eingebaut. Solche Daten sollten allerhöchstens verschlüsselt, besser aber gar nicht (Hash) transportiert werden.

Zweitens:
Nimm es mir bitte nicht übel, aber wer Software für Menschen schreibt, die ihre Bankgeschäfte damit tätigen und solch sensible Daten dazu eingeben, der sollte auf solche Ideen gar nicht erst kommen.


----------



## KonradN (2. Apr 2022)

Also was hier rein kommt ist: Du authentifizierst nicht (immer) selbst sondern vertraust einer anderen Stelle.

Ein User kann sich z.B. mit Name / Passwort direkt bei dir anmelden. Da wird dann das Passwort im Hash gespeichert wie es schon richtig gesagt wurde.
Dann vertraust Du aber auch anderen Stellen. So kann ein User, der sich angemeldet hat, weitere Dinge hinterlegen. Beispiele findest Du oft: Hier im Forum kann an seinen Google Account hinterlegen und sich dann mit dem Google Account anmelden. Damit dies funktioniert, muss erst einmal ein Vertrauensverhältnis geschaffen werden: Das Forum vertaut Google. Wenn Google etwas sagt, dann wird das so stimmen. Das Vertrauen ist hinterlegt im Forum, sprich bei Google dürfte es so sein, dass man das Forum bei Google hinterlegt hat (spezielle URLs die zur Anmeldung funkionieren sollen) und Google hat auch gewisse Daten zur Hinterlegung an das Forum gegeben, so dass Google auch das Forum kennt und identifizieren kann.

Und schon funktioniert die Anmeldung:
- Der User sagt im Forum: Ich will mich über Google anmelden.
- Das Forum gibt das weiter an Google. Google fragt dann ggf. nach eine Anmeldung. Oder der User ist bereits angemeldet.. Auf jeden Fall kommt dann am Ende ein Aufruf beim Forum heraus, der besagt, dass ein User sich angemeldet hat. Das sind irgendwelche Daten, die den User identifizieren. Damit kann das Forum dann prüfen: Stimmen diese Daten mit den hinterlegten Daten überein? Wenn dem so ist, dann ist der User angemeldet.

Das ist so ein kleines Schema, etwas vereinfacht und grob dargestellt. Es gibt da auch diverse Varianten. Aber es geht immer so in der Art.

Deine App auf dem Handy will auch die Autorisierung per Fingerabdruck anbieten? Dazu vertraut es dann dem Android Service für Fingerabdrücke. Dein Anwender muss das erst einmal hinterlegen, d.h. in der App muss das einmal entsprechend konfiguriert werden vom User. Danach kann man sich dann bei der Anmeldung auch damit autorisieren: Einfach weil die App eben diesem Service vertraut.

Das ist übrigens ein ganz übliches Pattern. Hintergrund ist, dass dies ein sensibles Thema ist und auch ständig neue Features dazu kommen. Also will man als Entwickler das nicht selbst machen (Hoch komplexes Thema, was will ich mich da einarbeiten?) und dann auch ständig neue Features implementieren (User wollen 2FA, wollen Drittdienste, wollen irgendwelche Hardware, ..... ) und dann noch so Dinge wie SSO (Single Sign On). Das wird also schnell deutlich umfangreicher. Daher greift man oft gerne auf Standards zurück um dann fertige Produkte zu nutzen. Eine Applikation kann z.B. OAUTH2 nutzen. Dann kann da ein beliebigs Produkt verwendet werden. Eine Firma hat ein eigenes Identtity Management? So dies den Standard auch unterstützt, kann die App dies nutzen. Oder es wird ein Produkt genutzt wie z.B. KeyCloak: https://www.keycloak.org/

Das wirklich nur als ganz kurz kurzer Überblick. Da kann man sich sehr lange und viel einarbeiten. Das erste, was man sich anschauen sollte, sind die üblichen Abläufe, denn wenn man die verstanden hat, dann kann man die entsprechenden Standards nutzen.

Generell aber:
Flls Deine App sich woanders anmelden soll wo der User normalerweise User/Passwort verwendet, dann solltest Du da nach einer API schauen! Da wird sich oft etwas finden, das dann Deine App eine gewisse Zeit berechtigt. Dann kann der User die Anmeldung machen und die App nutzen ohne sich erneut anzumelden. Ist sowas nicht vorgesehen, dann ist es extrem kritisch, User /Passwort zu speichern. Egal ob verschlüsselt oder nicht. Du bist in der Lage, es zu entschlüsseln und was die App kann kann jeder, der die Kontrolle über das Gerät hat. Also ein ganz dickes NO GO!


----------



## wer112 (2. Apr 2022)

temi hat gesagt.:


> I.d.R. legt man nicht ein Passwort ab, sondern einen kryptografisch sicheren Hash (allgemein bekanntere Hashfunktionen sind z. B. SHA und MD5) des eingebenen Passworts.


MD5 ist nicht sicher. Das läuft über password_hash(klartext, Passwort_DEFAULT). Es ist mit Zeichen(%2...%)



temi hat gesagt.:


> Wenn der Benutzer sich anmeldet, wird seine Eingabe ebenfalls gehasht und mit dem gespeicherten Hash verglichen.


Ja, das ist ja klar. Das Klartext wird zur Seite geschickt und in ne PHP Very Form gehasht und verglichen... Aber wenn man sich mit Fingerabdruck anmelden möchte, möchte man nicht zusätzlich sich einloggen, dass soll ja der Fingerabdruck übernehmen.


----------



## wer112 (2. Apr 2022)

White_Fox hat gesagt.:


> Ich habe von solcher Art Software keinerlei Ahnung, dennoch zwei Dinge.
> 
> Erstens:
> 
> Damit hast du schonmal eine Schwachstelle eingebaut. Solche Daten sollten allerhöchstens verschlüsselt, besser aber gar nicht (Hash) transportiert werden.


Also wenn ich die Login Daten verschlüsselt offline speichern soll(Beim Browser wird es ja auch gespeichert), dann soll ich die Zugangsdaten bereits verschlüsselt runterladen und speichern und wenn der Nutzer sich anmelden möchte, wird es entschlüsselt und zum Login geschickt bzw. erst auf PHP entschlüsselt und dann gehasht. So in etwa deine Meinung?


White_Fox hat gesagt.:


> Zweitens:
> Nimm es mir bitte nicht übel, aber wer Software für Menschen schreibt, die ihre Bankgeschäfte damit tätigen und solch sensible Daten dazu eingeben, der sollte auf solche Ideen gar nicht erst kommen.


ICh kenne viele Banking Apps, wenn man sich erfolgeich eingeloggt hat, dass man erst da den Fingerabdruck aktiviert...


----------



## LimDul (2. Apr 2022)

wer112 hat gesagt.:


> Also wenn ich die Login Daten verschlüsselt offline speichern soll(Beim Browser wird es ja auch gespeichert), dann soll ich die Zugangsdaten bereits verschlüsselt runterladen und speichern und wenn der Nutzer sich anmelden möchte, wird es entschlüsselt und zum Login geschickt bzw. erst auf PHP entschlüsselt und dann gehasht. So in etwa deine Meinung?


Nein. Es darf keine Möglichkeit geben auf Server (PHP-Seite) etwas entschüsseln zu können.

Beschreib mal was du vorhast. Ein Fingerabdruck ist meist ein "zweites" Password. Man kann nie über den Fingerabdruck an das Passwort kommen, sondern es ist gespeichert "Fingerabdruck X = Account Y" zusätzlich zu "Hash Z = Account Y". Das Passwort darf niemals in irgendeiner entschlüsselbaren Form auf dem Server gespeichert werden.


----------



## temi (2. Apr 2022)

wer112 hat gesagt.:


> MD5 ist nicht sicher.


Darum steht ja auch "z. B." dort. Du kannst dir ja aussuchen, was du gerne hättest.


----------



## wer112 (2. Apr 2022)

KonradN hat gesagt.:


> Also was hier rein kommt ist: Du authentifizierst nicht (immer) selbst sondern vertraust einer anderen Stelle.


Beim Fingerabdruck über Session? Da wenn man sich nicht eigeloggt bleiben möchte, dann muss man sich ja immer Authentifizieren.


KonradN hat gesagt.:


> Ein User kann sich z.B. mit Name / Passwort direkt bei dir anmelden. Da wird dann das Passwort im Hash gespeichert wie es schon richtig gesagt wurde.
> Dann vertraust Du aber auch anderen Stellen. So kann ein User, der sich angemeldet hat, weitere Dinge hinterlegen. Beispiele findest Du oft: Hier im Forum kann an seinen Google Account hinterlegen und sich dann mit dem Google Account anmelden. Damit dies funktioniert, muss erst einmal ein Vertrauensverhältnis geschaffen werden: Das Forum vertaut Google. Wenn Google etwas sagt, dann wird das so stimmen. Das Vertrauen ist hinterlegt im Forum, sprich bei Google dürfte es so sein, dass man das Forum bei Google hinterlegt hat (spezielle URLs die zur Anmeldung funkionieren sollen) und Google hat auch gewisse Daten zur Hinterlegung an das Forum gegeben, so dass Google auch das Forum kennt und identifizieren kann.
> 
> Und schon funktioniert die Anmeldung:
> ...


In meinen Fall also: Wenn der Nutzer in der App Fingerabdruck aktiviert, dann wird die aktivierung in ShaPref gespeichert und der Nutzer bleibt in der Seesion eingeloggt. Wenn der Nutzer das nächste mal die Seite öffnet,


KonradN hat gesagt.:


> Das ist so ein kleines Schema, etwas vereinfacht und grob dargestellt. Es gibt da auch diverse Varianten. Aber es geht immer so in der Art.
> 
> Deine App auf dem Handy will auch die Autorisierung per Fingerabdruck anbieten? Dazu vertraut es dann dem Android Service für Fingerabdrücke. Dein Anwender muss das erst einmal hinterlegen, d.h. in der App muss das einmal entsprechend konfiguriert werden vom User. Danach kann man sich dann bei der Anmeldung auch damit autorisieren: Einfach weil die App eben diesem Service vertraut.
> 
> ...


----------



## wer112 (2. Apr 2022)

LimDul hat gesagt.:


> Nein. Es darf keine Möglichkeit geben auf Server (PHP-Seite) etwas entschüsseln zu können.
> 
> Beschreib mal was du vorhast. Ein Fingerabdruck ist meist ein "zweites" Password. Man kann nie über den Fingerabdruck an das Passwort kommen, sondern es ist gespeichert "Fingerabdruck X = Account Y" zusätzlich zu "Hash Z = Account Y". Das Passwort darf niemals in irgendeiner entschlüsselbaren Form auf dem Server gespeichert werden.


Ein Nutzer kann sich in der App einloggen und danach in den Login Einstellungen unter anderem Figerabdruck aktivieren.
Wenn man nicht angemeldet bleiben in den Login Eistellungen aktiviert hat, muss man jedes mal sich neu einloggen.
Sobald der Nutzer Fingerabdruck aktiviert hat, wird die Session nicht gelöscht und wenn er das nächste mal die App öffnet, kann er den Figerabdruck benutzen und dann kommt er zur Steuerung. Da wird es überprüft, ob der Nutzer bereits eingeloggt ist oder wenn die Session ungültig ist, dann wird er zur Login Screen weitergeleitet und dort muss er sich einlogen mit Email und Passwort.

Meine Überlegung war früher, dass wenn der Nutzer das aktiviert hat, dass die Zugangsdaten offline verschlüsselt gespeichert wird und wenn man die App öffnet und der Fingerabdruck stimmt, das die Daten entschlüsselt(So wie immer) an die Login PHP gesendet wird und dann überprüft wird, ob das Klartext Passwort mit dem Hash Passwort übereinstimmt.

Die Idee mit den Session klingt ansicht gut...
Ich habe sowas noch nie ansatzweise gemacht. Habe früher Firebase benutzt. In den letzten ca. 3 Monate habe ich angefangen PHP und PDO zu lernen, um mein eigenes system zu entwickeln. Deswegen, habe ich mich solange net hier im Forum gemeldet. Das System klappt schon sehr gut(benutze Volley). Jetzt muss ich ja die Schritte nach dem Login machen, da ich sowas noch nie gemacht habe und nicht weiß, wie es normalerweise gemacht wird, habe ich erstmal infos gesammelt, wie man das am besten macht, da ich in Bezug der Sicherheit schon teilweise *paranoid* bin.

Deswegen erfrage ich mich erstmal wie man das theoretisch macht. Ich kann ja keine Fingerabdrücke in der Datenbank speichern oder?


----------



## Oneixee5 (2. Apr 2022)

Ich habe die Sache mit dem Fingerabdruck vor ein paar Jahren mal "erforscht". In meinem Repo ist ein Hinweis auf: https://www.javacodegeeks.com/2016/12/android-fingerprint-authentication-tutorial.html. Das ist schon ein "paar" Jahre alt und ich weiß nicht ob das noch genau so funktioniert. Das Prinzip sollte damit aber klar werden. 
Das ist aber nur die Anmeldung in der App, ein Webserver hat damit erst mal nichts zu tun. Um mich dann bei einem Webserver anzumelden würde ich in der App ein Einmal-Passwort generieren - das kann auch über einen Drittanbieter erfolgen. Ich habe damals Okta verwendet, da es nicht um eine produktive App der Firma ging. Dazu habe ich auf die Schnelle folgendes gefunden: https://developer.okta.com/blog/2018/10/16/token-auth-for-java.


----------



## wer112 (2. Apr 2022)

Oneixee5 hat gesagt.:


> Ich habe die Sache mit dem Fingerabdruck vor ein paar Jahren mal "erforscht". In meinem Repo ist ein Hinweis auf: https://www.javacodegeeks.com/2016/12/android-fingerprint-authentication-tutorial.html. Das ist schon ein "paar" Jahre alt und ich weiß nicht ob das noch genau so funktioniert. Das Prinzip sollte damit aber klar werden.


Habs mir angeschaut und sieht kurz aus... KP was das mit dem Key zu tun hat. Das schnalle ich noch nicht...


Oneixee5 hat gesagt.:


> Das ist aber nur die Anmeldung in der App, ein Webserver hat damit erst mal nichts zu tun. Um mich dann bei einem Webserver anzumelden würde ich in der App ein Einmal-Passwort generieren


Das musst du mir erklären. Wie ich das in meinen Fall benutze. Da wenn ich den Fingerabdruck mache und es erfolgreich ist, wird ein OTP generiert. Woher weiß mein Webserver, das es richtig ist und zu welchem benutzer gehört?
Wann generiere ich das und dann auf den Server speichern?
Wenn ich mich eingeloggt habe, wird das OTG aus der Datenbank gelöscht und ein neues eingetragen, für das nächste mal und das neue wird offline gespeichert?

Ich kenne mich mit OTP nicht aus bzw. wie ich das verwenden soll bzw. mit dem Fingerabdruck...


Oneixee5 hat gesagt.:


> - das kann auch über einen Drittanbieter erfolgen. Ich habe damals Okta verwendet, da es nicht um eine produktive App der Firma ging. Dazu habe ich auf die Schnelle folgendes gefunden: https://developer.okta.com/blog/2018/10/16/token-auth-for-java.


----------



## Oneixee5 (3. Apr 2022)

wer112 hat gesagt.:


> Ich kenne mich mit OTP nicht aus bzw. wie ich das verwenden soll


Das Format eines Forums eignet sich nicht für eine komplette Schulung. Das musst die irgendwie anders lösen. 
Login-Platform und Server-Anwendung sind normalerweise getrennte Anwendungen. Also wir sprechen hier nicht von irgendwelchen PHP-Hobby-Projekten. Die Anmeldung erfolgt an der Loginplatform, ein Passwort hat in deiner Server-Anwendungs-DB gar nichts zu suchen. Ein OTP wird auch gar nicht irgendwo gespeichert, genau das will man ja erreichen. Die Login-Plattform übermittelt der Anwendung nur, "Login erfolgreich". Alles Andere kommt gar nicht bei der Anwendung an. Es ist zusätzlich üblich von der Login-Plattform einen Hashwert für den Nutzer zu erhalten. In der  DB hast du dann evtl. einen Namen für eine persönliche Anrede.


----------



## mihe7 (3. Apr 2022)

Zuerst einmal muss ich mich @KonradN anschließen. Security ist alles andere als trivial, die kleinsten Unachtsamtkeiten werden bestraft und die unterlaufen selbst den Profis, die nichts anderes machen (wobei es bei denen eher um Szenarien geht, wo etwaige Probleme übersehen wurden). Daher solltest Du immer auf was fertiges zurückgreifen.

*Hinweis: ich gebe im Folgenden nur gefährliches Halbwissen weiter. Wer sich darauf verlässt, ist selbst schuld.*

Das Problem, das Du lösen willst, nennt sich Authentisierung und Authentifizierung. Authentisierung ist der Nachweis der Identität, Authentifizierung die Überprüfung des Nachweises. Der Benutzer authentisiert sich, der Server authentifiziert.

Zunächst steht also die bloße Behauptung im Raum, dass eine Anfrage von Benutzer X stammt. Da das jeder behaupten kann, bedarf es einen Identitätsnachweises, der in Form wenigstens eines von drei möglichen Faktoren erbracht wird: Wissen, Besitz und körperliche Merkmale.

Du möchtest nun, dass der Benutzer den Nachweis per Biometrie führen kann. Tatsächlich könntest Du natürlich den Fingerabdruck (bzw. seine Merkmale) in der Datenbank am Server speichern und dort einen Abgleich vornehmen, aber das wäre keine gute Idee, denn damit ist lediglich überprüft, dass die gesendeten Daten dem Fingerabdruck entsprechen. Dass diese Daten auch wirklich vom Benutzer kommen, ist damit nicht sichergestellt.

Was tun? Eine Möglichkeit wäre, asymmetrische Verschlüsselungsverfahren einzusetzen. Der Benutzer erzeugt ein Schlüsselpaar und hinterlegt den öffentlichen Schlüssel auf dem Server, was kein Problem ist, weil der Schlüssel ja öffentlich ist. Den privaten Schlüssel verwahrt er sicher... Womit wir schon wieder beim Problem sind: wie? Hier hilft dann das Betriebssystem bzw. externe Hardware (TPM), die sicherstellen, dass der private Schlüssel never ever ausgelesen werden kann. Vielmehr kann der Schlüssel verwendet werden, um Daten zu verschlüsseln (=signieren) bzw. entschlüsseln.

Das ist letztlich das, was Android für Dich macht: Schlüssel sicher aufbewahren und Zugriff auf kryptografische Funktionen unter Verwendung dieser Schlüssel via Fingerabdruck zu ermöglichen (https://developer.android.com/reference/androidx/biometric/BiometricManager)

Bei der Anfrage wird nun nicht einfach nur behauptet, dass sie von Benutzer X stammt, sondern es wird durch eine Signatur nachgewiesen, die auf Serverseite überprüft werden kann. 

Achtung: das alleine ist noch nicht sicher. Wie oben bereits geschrieben haben sich da einige Leute viel Gedanken gemacht. Zu Details solltest Du Dich in OpenID Connect (und ggf. OAuth 2.0) einlesen.


----------

