The proper way of implementing user login system

14,336

Solution 1

A few clarifications:

  1. Don't use MD5. It's considered broken. Use SHA but I'd recommend something a little better than SHA1. - https://en.wikipedia.org/wiki/MD5
  2. You don't mention anything about salting the password. This is essential to protect against Rainbow tables. - https://en.wikipedia.org/wiki/Rainbow_tables
  3. The idea of salting/hashing passwords isn't really to protect your own application. It's because most users have a few passwords that they use for a multitude of sites. Hashing/salting prevents anyone who gains access to your database from learning what these passwords are and using them to log into their banking application or something similar. Once someone gains direct access to the database your application's security has already been fully compromised. - http://nakedsecurity.sophos.com/2013/04/23/users-same-password-most-websites/
  4. Don't use the database's built in security to handle your logins. It's hacky and gives them way more application access than they should have. Use a table.
  5. You don't mention anything about SSL. Even a well designed authentication system is useless if the passwords are sent across the wire in plain text. There are other approaches like Challenge/Response but unfortunately the password still has to be sent in plain text to the server when the user registers or changes their password. SSL is the best way to prevent this.

Solution 2

When a user login, client side code will encrypt the password by MD5 or SHA-1 or something like that, and then send this encrypted password to server side and then compare it with the one in database. If they are matched, the user log in successfully.

No, no, the client needs to send the unhashed password over. If you hash the password on the client side then that hash is effectively the password. This would nullify the security of the cryptographic hashing. The hashing has to be done on the server side.

To secure the plaintext password in transit it needs to be sent over a secure channel, such as an encrypted TLS (SSL) connection.


Passwords should be salted with a piece of extra data that is different for each account. Salting inhibits rainbow table attacks by eliminating the direct correlation between plaintext and hash. Salts do not need to be secret, nor do they need to be extremely large. Even 4 random bytes of salt will increase the complexity of a rainbow table attack by a factor of 4 billion.


The industry gold standard right now is Bcrypt. In addition to salting, bcrypt adds further security by designing in a slowdown factor.

Besides incorporating a salt to protect against rainbow table attacks, bcrypt is an adaptive function: over time, the iteration count can be increased to make it slower, so it remains resistant to brute-force search attacks even with increasing computation power.... Cryptotheoretically, this is no stronger than the standard Blowfish key schedule, but the number of rekeying rounds is configurable; this process can therefore be made arbitrarily slow, which helps deter brute-force attacks upon the hash or salt.

Share:
14,336

Related videos on Youtube

Joey
Author by

Joey

Updated on August 12, 2022

Comments

  • Joey
    Joey almost 2 years

    I want to make a user login system for the purpose of learning. I have several questions.

    I did some research and found that the proper way of implementing a user login system is to store the user name/id and the encrypted/hashed version of the password in the database. When a user logs in, the password is encrypted client side (MD5, SHA-1 etc.) and sent to the server where it is compared with the one in database. If they match, the user log in successfully.

    This implementation prevents DBAs or programmers seeing the cleartext of the password in the database. It can also prevent hackers intercepting the real password in transit.

    Here is where I'm confused:

    1. What if the hackers know the hash/encrypted version of password (by hacking the database) or DBAs, programmers get the hashed version of the password by just simply reading the text in the database. They could then easily make a program that sends this hashed version of the password to the server allowing them to successfully log in. If they can do that, encrypting the password doesn't seem very useful. I think I misunderstanding something here.

    2. Is this (the way I described above) the most popular way to implement user login functionality? Does it follow current best practices? Do I have to do everything manually or does some database have the built-in ability to do the same thing? Is there a most common way/method of doing this for a website or a web app? If so, please provide me with details.

    3. My former company used couchDB to store user login info including passwords. They did not do too much with the encryption side of things. They said couchDB will automatically encrypt the password and store it in the documents. I am not sure if this is a safe way. If so, then it is pretty convenient for programmers because it saves lots of work.

    4. Is this way (point 3) secure enough for normal use? Do other database system such as mySQL have this kind of ability that can do the same thing? If so, does it mean that using mySQL built-in method is secure enough?

    I am not looking for a very super secure way of implementing user login functionality. I am rather looking for a way that is popular, easy-to-implement, proper, secure enough for most web applications. Please give me some advice. Details provided will be really appreciated.

  • Adam Baranyai
    Adam Baranyai over 6 years
    What if a system would hash the password client side, with a public salt, and then rehash the password server side with a private salt (ie, a string stored on the server, or a randomly generated salt on server side)? This way, the server would never know the actual plain text password, neither the plain text version of the password would be sent to the server any time for a hacker to fetch. I know, that a middle-man can still fetch the password hash, and try to brute force it with the salt in the javascript, but still, it would make his life considerably harder, aint it?
  • John Kugelman
    John Kugelman over 6 years
    If the client sends a hashed password to the server then the hashed password is effectively the real password. If a hacker intercepted the hashed password they could send it to the server without knowing the original unhashed one and the server would accept it.
  • Adam Baranyai
    Adam Baranyai over 6 years
    Yes, but this is also true with the plain text password that is being sent to the server. If a hacker intercepts it, it can use it plain and simply to login to the account. Yet if the plain text password is hashed, if a hacker intercepts that, he can only login to that specific website, and not to any other website where the client may have the same password.