Password hashing keeps user passwords safe by turning them into secret codes that are hard to guess or reverse.
Password hashing with bcrypt in Node.js
import bcrypt from 'bcrypt'; // To hash a password const hashedPassword = await bcrypt.hash(password, saltRounds); // To check a password const isMatch = await bcrypt.compare(plainPassword, hashedPassword);
saltRounds controls how strong the hashing is; higher means safer but slower.
Always use await or handle promises because bcrypt functions are asynchronous.
const bcrypt = require('bcrypt'); const password = 'mySecret123'; const saltRounds = 10; bcrypt.hash(password, saltRounds).then(hash => { console.log('Hashed password:', hash); });
const bcrypt = require('bcrypt'); const plainPassword = 'mySecret123'; const hashedPassword = '$2b$10$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36v1bq6j6q6q6q6q6q6q6q6'; bcrypt.compare(plainPassword, hashedPassword).then(result => { console.log('Password match:', result); });
This program hashes a password, then checks if the correct and wrong passwords match the hash, printing the results.
import bcrypt from 'bcrypt'; async function run() { const password = 'helloWorld!'; const saltRounds = 12; // Hash the password const hashed = await bcrypt.hash(password, saltRounds); console.log('Hashed password:', hashed); // Verify the password const isValid = await bcrypt.compare('helloWorld!', hashed); console.log('Password is valid:', isValid); const isInvalid = await bcrypt.compare('wrongPassword', hashed); console.log('Wrong password is valid:', isInvalid); } run();
Never store plain passwords, always store hashed versions.
Use a saltRounds value of at least 10 for good security.
Hashing is one-way: you cannot get the original password back from the hash.
Password hashing protects user data by turning passwords into secret codes.
Use bcrypt's hash to create a hashed password and compare to check passwords.
Always handle bcrypt functions asynchronously with await or promises.
Practice
bcrypt in a Node.js application?Solution
Step 1: Understand bcrypt's role
Bcrypt is designed to hash passwords securely, making them hard to reverse.Step 2: Identify the correct purpose
Encrypting data or compressing files are not bcrypt's functions; it focuses on password hashing.Final Answer:
To securely hash user passwords before storing them -> Option AQuick Check:
Password hashing = Secure storage [OK]
- Confusing hashing with encryption
- Thinking bcrypt compresses data
- Assuming bcrypt generates IDs
Solution
Step 1: Identify asynchronous hashing syntax
Bcrypt's async hash function requiresawaitand two arguments: password and salt rounds.Step 2: Check each option
hashSync uses the synchronous method, compare is for verification not hashing, and the hash call misses salt rounds.Final Answer:
const hashed = await bcrypt.hash(password, 10); -> Option AQuick Check:
Async hash needs await and salt rounds [OK]
- Using hashSync instead of async hash
- Calling compare instead of hash
- Omitting salt rounds argument
const bcrypt = require('bcrypt');
async function check() {
const password = 'secret123';
const hash = await bcrypt.hash(password, 10);
const result = await bcrypt.compare('secret123', hash);
console.log(result);
}
check();Solution
Step 1: Understand bcrypt.compare behavior
It returns true if the plain password matches the hashed password.Step 2: Analyze the code flow
The password 'secret123' is hashed and then compared with the same password, so result is true.Final Answer:
true -> Option BQuick Check:
Matching password returns true [OK]
- Expecting false for matching passwords
- Confusing compare with hash
- Ignoring async/await in code
const bcrypt = require('bcrypt');
async function verify() {
const password = 'mypassword';
const hash = bcrypt.hash(password, 10);
const match = await bcrypt.compare(password, hash);
console.log(match);
}
verify();Solution
Step 1: Check bcrypt.hash usage
Bcrypt.hash is async and returns a Promise, so it needs await to get the hashed string.Step 2: Identify the error impact
Without await, hash is a Promise, causing compare to fail or behave unexpectedly.Final Answer:
Missing await before bcrypt.hash causing hash to be a Promise -> Option DQuick Check:
Async hash needs await [OK]
- Forgetting await on async functions
- Confusing compare with hash
- Using invalid salt rounds
Solution
Step 1: Choose secure async hashing and verification
Using asyncbcrypt.hashwith salt rounds (12) and asyncbcrypt.compareis best practice.Step 2: Evaluate other options
Storing plain passwords and hashing input for string comparison is insecure, mixing sync hashing with async verification is inconsistent, and bcrypt has no encrypt/decrypt methods.Final Answer:
Hash the password with await bcrypt.hash(password, 12) and verify with await bcrypt.compare(input, storedHash) -> Option CQuick Check:
Async hash and compare with salt rounds = secure [OK]
- Storing plain passwords
- Mixing sync and async bcrypt calls
- Assuming bcrypt can encrypt/decrypt
Ready to prove it?
Pass the test and this pattern moves unknown
