Sicheres Login-System für App implementieren

Minilulatsch

Neues Mitglied
Hallo liebe Community,

ich bin aktuell eine Android-App am programmieren, genauer gesagt eine Client-Server-Anwendung. Dabei sollen sich die Nutzer über zuvor angelegte Konten beim Server anmelden können. Das ganze soll natürlich sicher ablaufen, da ich allerdings doch eher ein Anfänger bin, hätte ich einige grundsätzliche Fragen, wie man ein solches Login-System implementieren soll, damit die Zugangsdaten auch wirklich sicher ausgetauscht und gespeichert werden.

Also, angenommen die Client-App baut über TCP eine Verbindung zum Server auf. Nun meldet sich ein Nutzer mit seinem Nutzernamen und Passwort an, beides wird verschlüsselt zwischen Client und Server ausgetauscht. Zum Verschlüsseln hatte ich gedacht RSA zu benutzen. Also wird z.b das Passwort mit dem Public RSA-Key verschlüsselt und übertragen. Das verschlüsselte Passwort wird nun am Server entschlüsselt, gehasht und dann mit dem gespeicherten Hash des Nutzers in der Datenbanken verglichen. Stimmen sie überein, wird der Nutzer eingeloggt. Mein Problem liegt jetzt bei Folgendem: Ein Angreifer im Netzwerk könnte die Übertragung des Verschlüsselten Passworts ja mitlesen. Nun könnte er mit einer selbst erstellen Dritt-App das verschlüsselte Passwort ja direkt an den Server senden, ohne es vorher nochmal mit dem Public RSA-Key zu verschlüsseln. Der Server würde das verschlüsselte Passwort wieder bearbeiten und akzeptieren. Im Endeffekt würde das ja heißen, dass das verschlüsselte Passwort mit einer Dritt-App genau so benutzt werden könnte, wie das Klartext-Passwort bei der eigentlichen App, wobei die Sicherheit durch die Verschlüsselung hinfällig wäre. Hab ich einen Denkfehler bei dieser Vorgehensweise, sodass das Problem gar nicht besteht? Und wenn nicht, wie müsste eine Implementierung gestaltet sein, damit der Login, auch wenn er von dritten mitgelesen wird, nicht reproduziert werden kann.

Ich hoffe, dass Ihr für mich ein bisschen Licht ins dunkle bringen könnt.

LG Minilulatsch
 

Thallius

Top Contributor
Die Frage ist warum du das Rad neu erfinden willst. Das was du suchst gibt es fertig und nennt sich HTTPS.
Weiterhin solltest du niemals das Passwort übers Netz schicken auch nicht verschlüsselt, sondern immer nur den Hash des Passwortes.

Gruß

Claus
 

Thallius

Top Contributor
Was in 99% der Fälle genauso sicher/unsicher ist ;)

Jein, wenn Password vershlüsselt verschickt wird und irgendjemand entschlüsselt es, weil sich der Programmierer dumm angestellt hat, dann kann dieser ja nicht nur auf dieser Seite meinen Account benutzen sondern alle auf denen ich das gleiche Passwort benutze. Mit dem Hash kann er auf anderen Seiten nichts anfangen.

Gruß

Claus
 

Minilulatsch

Neues Mitglied
Erstmal danke für eure Antworten. Es ist natürlich wenn man das Rad auch benutzt, das schon erfunden wurde^^. Aber gerade als Anfänger hab ich Interesse daran zu wissen, wie man das Konzept für sowas bei Bedarf selber gestalten könnte. Aber ich hab mir dann jetzt doch mal ein bisschen was zu SSL in Java angeguckt und werde mal versuchen daraus was vernünftiges zu basteln. Danke für eure Hilfe!

LG Minilulatsch
 

Bitfehler

Bekanntes Mitglied
Nach Möglichkeit sollte die Verbindung explizit über TLS1.2 erfolgen.
Mit Hilfe eines Salts könnte man noch die Entropie erhöhen.
 

Tobse

Top Contributor
Jein, wenn Password vershlüsselt verschickt wird und irgendjemand entschlüsselt es, weil sich der Programmierer dumm angestellt hat, dann kann dieser ja nicht nur auf dieser Seite meinen Account benutzen sondern alle auf denen ich das gleiche Passwort benutze. Mit dem Hash kann er auf anderen Seiten nichts anfangen.

Gruß

Claus
Da stimme ich dir zu. Wenn es hier aber um Security Best-Practices geht, dann doch bitte eine Challenge-Response über HTTPS. Und wenn man fancy drauf ist kann man mit dem ersten Login auch einen Geräte-Spezifisches Keypair beim Server registrieren; alle weiter Authentifizierung läuft dann über das in TLS eingebaute Client-Certificate. Letzteres ist aber für die meisten Fälle ein ziemlicher overkill....

@TE:
Ein Challenge-Response funktioniert folgendermaßen:
Code:
# User gibt Username und Passwort in das Login-Formular ein und klickt "Login"
Client -> Server: Ich möchte mich gerne mit dem Account XY anmelden.
Server -> Client: Ok. Hier ist ein Challenge-Code ABCD
Client -> Server: HMAC(HASH(eingegebenesPasswort), ABCD)
# Server prüft ob HMAC(HASH(richtigesPasswort), ABCD) identisch ist mit dem gesendeten Passwort; je nach Ergebnis... u.s.w.

Wichtig ist hierbei, dass der Server auch nur den Hash des Passworts speichert (siehe Argument von Claus im Fall dass dein Server gehackt wird). Und es ist wichtig, dass der Challenge-Code für jeden Login neu und zufällig generiert wird (siehe dazu java.security.SecureRandom; auf keinen Fall Math.random() oder java.math.Random benutzen!)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Jenkins Login per Java Download Manager Netzwerkprogrammierung 15
T HTTP JSoup Automatic Website Login Netzwerkprogrammierung 1
Q-bert Link zugang ohne login sperren. Netzwerkprogrammierung 1
S Jsoup Login auf Schulserver Netzwerkprogrammierung 3
T Netzwerk Login Felder ansprechen Netzwerkprogrammierung 1
M HTTPS Login & etwas posten Netzwerkprogrammierung 0
K Login Shibboleth Netzwerkprogrammierung 0
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
N HTTP Apache 4.2.1 HttpClient 302 nach Login und auf den weiteren Seiten. Netzwerkprogrammierung 5
D HTTP Frage zu Login & Session ID Netzwerkprogrammierung 5
J Login Bereich auf jeder Seite Netzwerkprogrammierung 4
G Cookie Verwaltungs Problem nach Login auf InetSeite (Wo utma-Cookie?) Netzwerkprogrammierung 18
I HTTP S - Zertifikate+Cockies für Form-basierten Login Netzwerkprogrammierung 2
S Automatischer Login auf einer Webseite Netzwerkprogrammierung 12
E Webseite mit Login laden Netzwerkprogrammierung 5
C Login ohne Erfolg Netzwerkprogrammierung 2
xDarkSunx Hilfe Chat Login Netzwerkprogrammierung 7
T Java => Login mit MySQL Netzwerkprogrammierung 10
M Login mit HtmlUnit Netzwerkprogrammierung 6
K Login via apache httpclient Netzwerkprogrammierung 4
N Login mit Roboter Netzwerkprogrammierung 16
S HTTP Login mit CAS Authentisierung über SSL Netzwerkprogrammierung 2
M Servlet als Login Netzwerkprogrammierung 20
J Socket Doppel Login geht nicht Netzwerkprogrammierung 11
N Login auf Website Netzwerkprogrammierung 11
H HTTP Login mit POSTMethod und httpClient Netzwerkprogrammierung 5
K HTTP Login Internetseite Netzwerkprogrammierung 17
lordcarlos HTTP Apache HttpClient, post und login. Netzwerkprogrammierung 2
G ftp login Netzwerkprogrammierung 10
L Web Login Netzwerkprogrammierung 3
K Bad Request nach Form Login in Jakarta HttpClient Netzwerkprogrammierung 4
H Login Chatsystem Netzwerkprogrammierung 5
2 Redirect, Login und Download bei Rapidshare.com Netzwerkprogrammierung 4
lebenlechzer Login per Telnet auf Router Netzwerkprogrammierung 2
N icq login Netzwerkprogrammierung 16
M Problem: connection abbrechen und login erkennen Netzwerkprogrammierung 2
C Login bei einem php-script Netzwerkprogrammierung 2
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
S jCIFS Authentifizierungsprobleme an Hitachi NAS System Netzwerkprogrammierung 6
S RMI server in einem Mehrbenutzer-System mit Auth? Netzwerkprogrammierung 10
S Knuddels Chat System: Bot / Nachrichten verschicken? Netzwerkprogrammierung 6
M Download-Manager in System/Browser einbinden Netzwerkprogrammierung 11
A server mit 2 Ports : Mit und ohne SSL Chat system Netzwerkprogrammierung 10

Ähnliche Java Themen

Neue Themen


Oben