Understanding Salt and Pepper
Learn the roles of salt and pepper in password hashing and how they complement each other.
Problem
You want to understand when to use a salt versus a pepper and how each protects against different attack vectors.
Prerequisites
- Understanding of password hashing
- Knowledge of rainbow tables and brute force
Steps
-
1. Understand the salt
A salt is a random value generated per password and stored alongside the hash. It ensures that identical passwords produce different hashes, defeating rainbow tables and multi-target attacks. The salt is not secret; its value comes from being unique.
Inputuser A: salt=a1 | user B: salt=b2Outputsame password → different hashes -
2. Understand the pepper
A pepper is a secret value shared across all passwords but not stored with the hash. It is stored in a separate secure location (e.g., environment variable or HSM). If the database is leaked but the pepper is not, the attacker cannot crack any password without also obtaining the pepper.
Inputpepper: secret env varOutputhash = KDF(password + salt + pepper) -
3. Combine both for defense in depth
Use a per-password salt (stored) plus a global pepper (secret). The salt defends against rainbow tables and identical-password detection. The pepper adds a second layer: even with the full database, passwords cannot be cracked without the pepper. Keep the pepper in a separate secrets manager.
Inputsalt + pepperOutputlayered protection
Expected result
Password hashes protected by both per-password salts and a secret pepper, providing defense in depth.
Common errors
- Storing the pepper in the database
- The pepper must be stored separately from the hashes, otherwise it provides no additional protection if the database is leaked.
- Using the same salt for all passwords
- Generate a unique random salt per password. A shared salt defeats the purpose of salting.
Troubleshooting
- If you lose the pepper, all passwords become unverifiable. Back up the pepper securely.
- If migrating, you can re-hash with a new pepper by verifying with the old one and re-hashing.
Security limits
- The pepper is only effective if it remains secret. Store it in an HSM or secrets manager, not in source code.
- All hashing is local.
Related tools
Related glossary
Related tasks
Ready to run it?