Cách băm và xác minh mật khẩu trong Node.js với bcrypt
Một trong những cách tốt nhất để lưu trữ mật khẩu một cách an toàn là muối và băm chúng. Salting và băm chuyển đổi một mật khẩu thuần túy thành một giá trị duy nhất khó đảo ngược. Thư viện bcrypt cho phép bạn băm và mật khẩu muối trong Node.js với rất ít nỗ lực.
Mục Lục
Băm mật khẩu là gì?
Băm mật khẩu có nghĩa là chuyển một mật khẩu văn bản thuần túy thông qua thuật toán băm để tạo ra một giá trị duy nhất. Một số ví dụ về thuật toán băm là bcrypt, scrypt và SHA. Nhược điểm của băm là nó có thể dự đoán được.
Mỗi khi bạn chuyển cùng một đầu vào cho một thuật toán băm, nó sẽ tạo ra cùng một đầu ra. Một hacker có quyền truy cập vào mật khẩu đã băm có thể đảo ngược kỹ thuật mã hóa để lấy mật khẩu ban đầu. Họ có thể sử dụng các kỹ thuật như tấn công bạo lực hoặc bàn cầu vồng. Đây là lúc muối đi vào.
Mật khẩu muối là gì?
Ướp muối mật khẩu thêm một chuỗi ngẫu nhiên (muối) vào mật khẩu trước khi băm nó. Bằng cách này, hàm băm được tạo sẽ luôn khác nhau mỗi lần. Ngay cả khi một hacker lấy được mật khẩu đã băm, việc họ phát hiện ra mật khẩu gốc đã tạo ra nó là không thực tế.
Cách sử dụng bcrypt để băm và xác minh mật khẩu
bcrypt là một mô-đun npm giúp đơn giản hóa quá trình ướp muối và băm mật khẩu.
Bước 1: Cài đặt bcrypt
Sử dụng npm:
npm install bcrypt
Sử dụng sợi:
yarn add bcrypt
Bước 2: Nhập bcrypt
const bcrypt = require("bcrypt")
Bước 3: Tạo muối
Để tạo muối, hãy gọi bcrypt.genSalt () phương pháp. Phương thức này chấp nhận một giá trị số nguyên là yếu tố chi phí xác định thời gian cần thiết để băm mật khẩu. Yếu tố chi phí càng cao, thuật toán càng mất nhiều thời gian và càng khó đảo ngược hàm băm bằng cách sử dụng brute force. Giá trị tốt phải đủ cao để bảo mật mật khẩu nhưng cũng đủ thấp để không làm chậm quá trình. Nó thường nằm trong khoảng từ 5 đến 15. Trong hướng dẫn này, chúng tôi sẽ sử dụng 10.
bcrypt.genSalt(10, (err, salt) => {
// use salt to hash password
})
Bước 4: Băm mật khẩu
Chuyển mật khẩu đơn giản và muối được tạo đến băm () phương pháp:
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(plaintextPassword, salt, function(err, hash) {
});
})
Khi bạn đã tạo băm, hãy lưu trữ nó trong cơ sở dữ liệu. Bạn sẽ sử dụng nó để xác minh mật khẩu và xác thực người dùng đang cố gắng đăng nhập.
Thay vì tạo muối và băm riêng biệt, bạn cũng có thể tự động tạo muối và băm bằng cách sử dụng một hàm duy nhất.
bcrypt.hash(plaintextPassword, 10, function(err, hash) {
});
Bước 5: So sánh mật khẩu bằng bcrypt
Để xác thực người dùng, bạn sẽ cần so sánh mật khẩu họ cung cấp với mật khẩu trong cơ sở dữ liệu. bcrypt.compare () chấp nhận mật khẩu văn bản thuần túy và mã băm mà bạn đã lưu trữ, cùng với chức năng gọi lại. Lệnh gọi lại đó cung cấp một đối tượng có chứa bất kỳ lỗi nào đã xảy ra và kết quả tổng thể từ việc so sánh. Nếu mật khẩu khớp với hàm băm, kết quả là true.
bcrypt.compare(plaintextPassword, hash, function(err, result) {
if (result) {
}
});
Sử dụng Async / Await
Bạn có thể băm và xác minh mật khẩu bằng async / await như sau.
async function hashPassword(plaintextPassword) {
const hash = await bcrypt.hash(plaintextPassword, 10);
}
async function comparePassword(plaintextPassword, hash) {
const result = await bcrypt.compare(plaintextPassword, hash);
return result;
}
Sử dụng lời hứa
Thư viện bcrypt cũng hỗ trợ việc sử dụng các hứa hẹn.
function hashPassword(plaintextPassword) {
bcrypt.hash(plaintextPassword, 10)
.then(hash => {
})
.catch(err => {
console.log(err)
})
}function comparePassword(plaintextPassword, hash) {
bcyrpt.compare(plaintextPassword, hash)
.then(result => {
return result
})
.catch(err => {
console.log(err)
})
}
Băm và ướp muối là một chiến thắng dễ dàng
Bạn có thể sử dụng thư viện bcrypt để băm và xác minh mật khẩu trong Node.js. Việc băm mật khẩu giảm thiểu khả năng tội phạm mạng sử dụng chúng để truy cập vào dữ liệu hoặc dịch vụ nhạy cảm. Ướp muối mật khẩu đã băm của bạn làm cho chúng an toàn hơn. Ngoài việc băm, hãy luôn xác thực độ mạnh của mật khẩu như một biện pháp bảo mật bổ sung.
Đọc tiếp
Giới thiệu về tác giả