I'm currently developing an Android Application that communicates with a server and needs the user to login.
The connection is secured with SSL and certificate pinning.
For user authentication I'm currently using challenge-response.
The server stores a PBKDF2 hash of the password and the salt used in the PBKDF2 (called PBKDF2(password,salt) ). Parameters for PBKDF2 are: 10k iterations, SHA256, 32 byte output length.
The flow works as follows:
The Client transmits PBKDF2(Username,Salt) and the Salt
The Server looks up the username and sends back the password-salt and a 32 byte challenge.
The client returns PBKDF2(challenge,PBKDF2(password,salt)).
The server verifies the response and returns a session-token.
So neither the username nor the password are transmitted over the channel.
SSL in and of itself should be pretty secure, and adding certificate pinning should make it resistant to MITM.
Am I overlooking any flaws?
Or is the whole thing overkill given the fact that the connection is SSL encypted?