Get a Pentest and security assessment of your IT network.

Cyber Security

Secure Username & Password Login

TL;DR

This guide shows you how to build a secure username and password login system. We’ll cover storing passwords safely, handling logins, and protecting against common attacks.

1. Choosing a Secure Password Storage Method

Never store passwords directly in your database! Use a strong hashing algorithm like bcrypt or Argon2.

  • bcrypt: A well-established choice, widely supported.
  • Argon2: More modern and generally considered more secure, but may require more setup.

Most programming languages have libraries to help with this.

# Example using Python's bcrypt library
import bcrypt

hashed_password = bcrypt.hashpw(b'your_password', bcrypt.gensalt())
print(hashed_password)

2. Implementing the Login Process

  1. User Input: Get the username and password from the user (e.g., via a login form).
  2. Retrieve User: Find the user in your database based on their username.
  3. Password Verification: Compare the entered password with the stored hashed password using the same hashing algorithm.
    # Example using Python's bcrypt library
    import bcrypt
    
    if bcrypt.checkpw(b'entered_password', stored_hashed_password):
      print("Password matches!")
    else:
      print("Incorrect password.")
  4. Session Management: If the password is correct, create a secure session for the user. Do not store the password in the session – only a unique session ID.

3. Protecting Against Common Attacks

  1. Brute-Force Attacks: Limit login attempts from a single IP address or username to prevent attackers from guessing passwords repeatedly.
    • Implement rate limiting (e.g., 5 failed attempts in 10 minutes).
    • Consider using CAPTCHAs after multiple failures.
  2. SQL Injection: Always use parameterized queries or prepared statements when interacting with your database to prevent attackers from injecting malicious SQL code.
    # Example (Python - using a placeholder)
    import sqlite3
    conn = sqlite3.connect('mydatabase.db')
    c = conn.cursor()
    c.execute("SELECT * FROM users WHERE username = ?", (username,)) # Safe!
  3. Cross-Site Scripting (XSS): Sanitize user input to prevent attackers from injecting malicious JavaScript code into your website.
    • Escape HTML characters.
    • Use a Content Security Policy (CSP).
  4. Cross-Site Request Forgery (CSRF): Use CSRF tokens to protect against attackers from forging requests on behalf of logged-in users.
    • Generate a unique token for each user session.
    • Include the token in all forms and verify it on submission.

4. Additional Security Measures

  • Two-Factor Authentication (2FA): Add an extra layer of security by requiring users to enter a code from their phone or email in addition to their password.
  • Password Complexity Requirements: Enforce strong passwords with minimum length, mixed case letters, numbers and symbols.
  • Regular Security Audits: Regularly review your code and infrastructure for vulnerabilities.
Related posts
Cyber Security

Zip Codes & PII: Are They Personal Data?

Cyber Security

Zero-Day Vulnerabilities: User Defence Guide

Cyber Security

Zero Knowledge Voting with Trusted Server

Cyber Security

ZeroNet: 51% Attack Risks & Mitigation