Best Practice for Storing User Passwords


Noah Wilson

Published: Jan. 5th, 2024

dark screen with covered in computer code

Overview

In today's digital landscape, the inclusion of a user login system is a commonplace feature across websites. However, a troubling trend persists - many websites compromise their users' security by neglecting best practices in password protection. Such lapses not only jeopardize user data but also open the door for malicious actors to exploit vulnerabilities.

In this comprehensive article, I delve into the intricacies of password security, shedding light on how hackers exploit weaknesses and providing actionable insights for developers to fortify their systems. My focus is on fortifying the foundation of user authentication with these essential principles:

  • Never Compromise on Password Storage: Never store passwords in plain text.
  • Embrace Cutting-Edge Hashing Algorithms: Stay ahead of the curve by adopting the latest and most robust hashing algorithms.
  • Individualized Security with Unique Hashed Values: Ensure user password protection with the implementation of unique, per-user hashed values.

Join me on this journey to safeguard your user login systems and fortify your web applications against the ever-present threat of password theft. By the end of this article, you'll be equipped with the knowledge and tools necessary to protect your users and your digital assets.

The Challenge

In an era plagued by frequent database breaches, it is of utmost importance for web developers to exercise meticulous caution when handling user passwords. While it may seem like a glaringly obvious best practice, the stark reality is that even renowned companies have fallen victim to the avoidable pitfall of storing plain text user passwords in their databases. In the event of a breach, handing over readable passwords to malicious actors is a like stealing candy from a baby.

Regrettably, some developers resort to lazy shortcuts, such as base64 encoding, in a futile attempt to obfuscate passwords. However, these common encoding techniques offer little resistance to determined hackers. The true best practice lies in staying up-to-date with the latest advancements in hashing algorithms. These algorithms undergo continuous refinement to thwart evolving threats, necessitating ongoing research into the current best practice.

Yet, even with the use of complex modern algorithms, a glaring vulnerability persists. When two users employ the same password, the absence of a mechanism to generate a unique hash for each user leaves an exploitable gap. Consider a scenario where multiple users employ notoriously weak passwords like "1234" or "password." In this scenario, a hacker can leverage a precomputed list of hashed common passwords to compromise user data.

The Solution

To fortify your defenses against these threats, it is imperative to implement a technique known as 'password salting.' This involves generating a random string unique to each user and concatenating it with their password before hashing. By doing so, 'salting' ensures that the same hashed password will not appear in your database more than once, bolstering your security measures significantly.

The heart of this code is the "salt_and_hash" function, which takes a plain text password as input and transforms it into a securely hashed version. Here's how it works:


function salt_and_hash($plaintext){
	$salt = bin2hex(random_bytes(32));
	$salted_password = $plaintext.$salt;
	$hashed_password = hash('sha512', $salted_password);

	return $hashed_password;
	
}