Ảnh chụp màn hình của cơ sở dữ liệu
Những gì nó làm
Lưu trữ dữ liệu người dùng như email và mật khẩu trong cơ sở dữ liệu
được xây dựng với
- ejs
- mongodb
- cầy mangut
- nút. js
dùng thử
- github. com
Nộp cho
Ngày hack địa phương. Xây dựng ngày 5
Được tạo bởi
Akshara SPA
Khi xây dựng ứng dụng với Node. js, MongoDB và Mongoose, sẽ có lúc bạn cần xử lý mật khẩu người dùng
Vì việc lưu trữ mật khẩu dưới dạng văn bản thuần túy trong cơ sở dữ liệu của bạn là điều tối kỵ, bạn phải xử lý và lưu trữ chúng như thế nào?
Câu trả lời là tạo ra cái được gọi là hàm băm của mật khẩu. Đây là một chuỗi dài, phức tạp và duy nhất được tạo bằng cách sử dụng phiên bản văn bản thuần túy của mật khẩu người dùng. Thay vì lưu trữ mật khẩu văn bản thuần túy của người dùng trong cơ sở dữ liệu, thay vào đó, bạn sẽ lưu trữ phiên bản băm
Nếu cơ sở dữ liệu của bạn bị tấn công trong trường hợp này, tin tặc sẽ để lại các chuỗi băm ngẫu nhiên thay vì các chuỗi văn bản thuần túy mà chúng có thể sử dụng để dễ dàng khai thác tài khoản người dùng của bạn
Cách duy nhất để tìm mật khẩu hoặc thông báo tạo ra một hàm băm nhất định là thử tìm kiếm brute-force-các đầu vào có thể để xem liệu chúng có tạo ra kết quả khớp hay không. Hoặc sử dụng bảng cầu vồng của các giá trị băm phù hợp. Nếu bạn tạo các giá trị băm của mình một cách chính xác, cả hai phương pháp sẽ khiến tin tặc mất rất nhiều thời gian và hàng tấn sức mạnh tính toán để hoàn thành [tốn tiền]
Trước khi tiếp tục, chúng tôi sẽ cho rằng bạn có Node. js được cài đặt trên máy của bạn và cơ sở dữ liệu MongoDB để hoạt động với cơ sở dữ liệu được kết nối với Nút của bạn. ứng dụng js
Nếu cần, chúng tôi đã viết hướng dẫn cài đặt Node. js và một hướng dẫn khác về cách tạo và kết nối với cơ sở dữ liệu MongoDB Atlas bằng Node. js
Trước khi chúng tôi có thể lưu trữ mật khẩu đã băm trong cơ sở dữ liệu, chúng tôi cần cài đặt bcrypt. gói NPM js
Bcrypt là một trong những thư viện mã hóa được sử dụng nhiều nhất hiện nay. Nó kết hợp mã hóa băm cùng với hệ số công việc, cho phép bạn xác định mức độ tốn kém của hàm băm [i. e. mất bao lâu để giải mã nó bằng các biện pháp vũ phu]. Do đó, nó tuân theo định luật Moore, vì vậy khi máy tính trở nên nhanh hơn, bạn có thể tăng hệ số công việc và hàm băm sẽ chậm hơn đối với brute force
npm install bcryptjs --save
Bây giờ chúng ta có thể băm mật khẩu và lưu trữ nó trong cơ sở dữ liệu
Trước tiên, hãy xem qua chức năng cơ bản sẽ lấy mật khẩu văn bản và tạo hàm băm
const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
Đầu tiên, chúng ta tạo hai biến tên là
const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
6 và const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
7Biến mật khẩu sẽ là chuỗi băm bcrypt. Ví dụ: đây sẽ là chuỗi được người dùng nhập thông qua biểu mẫu đăng ký
Và số nguyên
const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
7 cho phép chúng ta kiểm soát chi phí xử lý dữ liệu sẽ là bao nhiêu. Con số càng cao, máy sẽ mất nhiều thời gian hơn để tính toán hàm băm được liên kết với mật khẩuVì vậy, chúng tôi muốn chọn một con số đủ cao để khiến một cuộc tấn công vũ phu mất quá nhiều thời gian và đủ ngắn để giữ cho sự kiên nhẫn của người dùng cuối không bị mất khi đăng ký hoặc đăng nhập vào tài khoản của họ
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
. . .
}
}]
Phương thức
const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
9 lấy số nguyên const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
7 của bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
. . .
}
}]
1 làm tham số và trả về hàm gọi lại có bao gồm kết quả muối được tạobcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
Phương thức
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
. . .
}
}]
2 này lấy chuỗi bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
. . .
}
}]
3 [sẽ là giá trị mật khẩu do người dùng nhập] và muối mà chúng tôi đã tạo làm tham số. Trong hàm bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
. . .
}
}]
4, nó ghi lại chuỗi băm được tạo cho mật khẩu của chúng taKhi bạn chạy mã, hàm băm sẽ được in ra dòng lệnh của bạn và trông giống như thế này
$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
Đây là chuỗi bạn sẽ lưu trữ trong cơ sở dữ liệu của mình thay vì mật khẩu ở dạng văn bản thuần túy
Bây giờ chúng ta đã biết cách tạo mật khẩu băm, hãy xem cách thêm nó vào cơ sở dữ liệu bằng Mongoose
Nếu bạn chưa cài đặt Mongoose, bạn có thể thực hiện bằng một trong các lệnh bên dưới
npm install mongoose --save
const mongoose = require["mongoose"]
const bcrypt = require["bcryptjs"]
const UserSchema = new mongoose.Schema[{
username: String,
password: String
}]
module.exports = mongoose.model["User", UserSchema]
Đầu tiên, chúng tôi tạo cái gọi là Lược đồ Mongoose với lớp
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
. . .
}
}]
5. Mỗi khóa trong mã bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
. . .
}
}]
6 xác định một thuộc tính trong tài liệu sẽ được thêm vào cơ sở dữ liệu MongoDBĐể sử dụng định nghĩa lược đồ, chúng ta cần chuyển đổi biến
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
. . .
}
}]
6 thành mô hình Mongoose mà chúng ta có thể làm việc với. Để làm điều đó, chúng tôi chuyển nó vào phương thức bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
. . .
}
}]
8. Sau đó, chúng tôi xuất mô hình để chúng tôi có thể bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
. . .
}
}]
9 và sử dụng nó trong các tệp khác nơi chúng tôi tương tác với cơ sở dữ liệuBất cứ khi nào một người dùng mới được thêm vào cơ sở dữ liệu, mô hình này sẽ được sử dụng để cho Mongoose biết loại dữ liệu nào cần được đưa vào
Tiếp theo, chúng ta cần thêm chức năng Mongoose vào mô hình mà chúng ta vừa tạo. Phần mềm trung gian này cần muối và băm mật khẩu trước khi chúng được lưu vào cơ sở dữ liệu
UserSchema.pre["save", function [next] {
const user = this
if [this.isModified["password"] || this.isNew] {
bcrypt.genSalt[10, function [saltError, salt] {
if [saltError] {
return next[saltError]
} else {
bcrypt.hash[user.password, salt, function[hashError, hash] {
if [hashError] {
return next[hashError]
}
user.password = hash
next[]
}]
}
}]
} else {
return next[]
}
}]
Đây là chức năng phần mềm trung gian của Mongoose
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
0 sẽ được gọi trước khi bất kỳ tài liệu người dùng nào được lưu hoặc thay đổi. Và có mục đích chung là băm mật khẩu bất cứ khi nào tài liệu người dùng được lưu vào cơ sở dữ liệu với giá trị mật khẩu mớiBên trong chức năng phần mềm trung gian
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
0, điều đầu tiên chúng tôi làm là kiểm tra xem chức năng của chúng tôi có cần băm mật khẩu thông qua mã bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
2 hay khôngĐiều này có nghĩa là hàm của chúng ta cần băm mật khẩu cho tài liệu nếu giá trị
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
3 đã bị thay đổi [i. e. người dùng đã thay đổi mật khẩu của họ] hoặc một tài liệu hoàn toàn mới đang được thêm vào cơ sở dữ liệu [i. e. một người dùng mới đã đăng ký]. Mặt khác, hàm bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
0 không cần thực hiện bất kỳ thao tác băm nàoSau đó, chúng tôi sử dụng phương pháp
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
. . .
}
}]
2 để tạo hàm băm cho mật khẩu. Nó lấy mật khẩu và muối mà chúng tôi đã tạo làm tham số. Trong hàm gọi lại, nó trả về chuỗi băm được tạo cho mật khẩu của chúng tôiKhi mật khẩu của bạn được lưu vào cơ sở dữ liệu, chuỗi băm sẽ giống như thế này
$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
Để bạn tham khảo, mã cho toàn bộ mô hình Mongoose mẫu sẽ như thế này
const mongoose = require["mongoose"]
const bcrypt = require["bcryptjs"]
const UserSchema = new mongoose.Schema[{
username: String,
password: String
}]
UserSchema.pre["save", function [next] {
const user = this
if [this.isModified["password"] || this.isNew] {
bcrypt.genSalt[10, function [saltError, salt] {
if [saltError] {
return next[saltError]
} else {
bcrypt.hash[user.password, salt, function[hashError, hash] {
if [hashError] {
return next[hashError]
}
user.password = hash
next[]
}]
}
}]
} else {
return next[]
}
}]
module.exports = mongoose.model["User", UserSchema]
Bây giờ mô hình sẽ sẵn sàng để sử dụng khi thêm mật khẩu băm của người dùng vào cơ sở dữ liệu
Ví dụ, chúng ta hãy xem mô hình Mongoose sẽ được sử dụng như thế nào trong thực tế
Hãy tạo một kịch bản tưởng tượng trong đó bạn có một biểu mẫu đăng ký trên trang web của mình có cả trường nhập tên người dùng và mật khẩu
Khi người dùng đó gửi trường, bạn muốn tạo một người dùng mới trong cơ sở dữ liệu với tên người dùng và mật khẩu băm của người dùng
const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
0Mã này tạo một hàm cơ bản có tên là
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
6 được xuất bằng cách sử dụng đối tượng bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
7Trong hàm, chúng tôi sử dụng mô hình Mongoose
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
8. Điều này được nhập vào tệp và đại diện cho mô hình Mongoose mẫu mà chúng tôi đã tạo một lúc trướcbcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
9 và const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
6 đại diện cho các giá trị được nhập bởi người dùng thông qua trang web của bạn. Và chức năng gọi lại được sử dụng để kết thúc chức năng sau khi hoàn thành nhiệm vụ lưu người dùng mới vào cơ sở dữ liệuBên trong hàm, chúng tôi tạo một tài liệu cơ sở dữ liệu người dùng mới bằng cách sử dụng phương thức
$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
1const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
1Điều này tạo ra một tài liệu mới với các giá trị tham số chức năng
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
9 và const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
6 bao gồmSau đó, chúng tôi sử dụng phương thức
$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
4 của Mongoose để thêm tài liệu vào cơ sở dữ liệuTrước khi mật khẩu của bạn được lưu, phương pháp
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
0 mà chúng tôi đã thêm vào mô hình Mongoose sẽ băm mật khẩu của bạnSau khi bạn tạo một người dùng mới trong cơ sở dữ liệu với chức năng đó, nó sẽ chứa tên người dùng và mật khẩu băm của người dùng
Bây giờ chúng tôi đã băm mật khẩu của người dùng và lưu trữ nó trong cơ sở dữ liệu, chúng tôi cần một cách để so sánh nó với một chuỗi được nhập bởi người dùng [i. e. trên trang đăng nhập] và xem nó có khớp với mật khẩu ban đầu được nhập cho tài khoản đó không
May mắn thay, Bcrypt có một cách tích hợp để làm điều này bằng cách sử dụng phương pháp
$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
6 của họPhương thức này sẽ lấy một chuỗi mật khẩu và so sánh nó với hàm băm được lưu trữ trong cơ sở dữ liệu. Nếu hai giá trị khớp nhau, nó sẽ trả về giá trị là
$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
7. Nếu không, nó sẽ trả về $2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
8 thay thếconst bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
2Đầu tiên, chúng ta tạo hai biến có tên là
$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
9 và npm install mongoose --save
0$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
9 đại diện cho mật khẩu mà người dùng sẽ nhập vào biểu mẫu đăng nhập và biến npm install mongoose --save
0 là những gì sẽ được lưu trữ trong cơ sở dữ liệu cho người dùngSau đó, chúng tôi sử dụng chức năng
npm install mongoose --save
3 để so sánh npm install mongoose --save
4 và npm install mongoose --save
0 với nhau. Nó có chức năng gọi lại trả về kết quả boolean [$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
7 hoặc $2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
8] cho biết mật khẩu có khớp hay khôngCuối cùng, chúng tôi sử dụng
npm install mongoose --save
8 để cho biết mật khẩu có khớp hay khôngNếu bạn cung cấp mật khẩu khớp với mật khẩu ban đầu được sử dụng để tạo hàm băm, thông báo sau sẽ được ghi lại
Bây giờ chúng ta đã biết cách khớp mật khẩu, hãy xem cách triển khai nó trong cơ sở dữ liệu MongoDB bằng Mongoose
const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
3Phương pháp này sử dụng
npm install mongoose --save
9 để so sánh tham số mật khẩu [i. e. từ một biểu mẫu đăng nhập trang web] và mật khẩu băm được lưu trữ trong cơ sở dữ liệu. Nếu mật khẩu khớp, thông báo thành công sẽ được trả về. Nếu không, thay vào đó, một thông báo lỗi sẽ được trả vềconst bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
4Ví dụ, chúng ta hãy xem mô hình Mongoose sẽ được sử dụng như thế nào trong thực tế
Hãy tạo một kịch bản tưởng tượng trong đó bạn có một biểu mẫu đăng nhập trên trang web của mình có cả trường tên người dùng và mật khẩu
Khi người dùng đó gửi trường, bạn muốn xem liệu người dùng có nên đăng nhập không. Điều này sẽ chỉ được phép nếu tên người dùng được tìm thấy trong cơ sở dữ liệu và khớp với mật khẩu được nhập qua trang đăng nhập
const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
5Trong mã này, chúng tôi khai báo một hàm mới có tên là
const mongoose = require["mongoose"]
const bcrypt = require["bcryptjs"]
const UserSchema = new mongoose.Schema[{
username: String,
password: String
}]
module.exports = mongoose.model["User", UserSchema]
0 có ba tham sốCác giá trị
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
9 và const bcrypt = require["bcryptjs"]
const password = "mypass123"
const saltRounds = 10
bcrypt.genSalt[saltRounds, function [saltError, salt] {
if [saltError] {
throw saltError
} else {
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
}
}]
6 là những gì người dùng sẽ nhập vào các trường đầu vào trên trang đăng nhập của trang web của bạnBên trong chức năng, điều đầu tiên chúng tôi làm là lấy người dùng từ cơ sở dữ liệu với
bcrypt.hash[password, salt, function[hashError, hash] {
if [hashError] {
throw hashError
} else {
console.log[hash]
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
}]
9 đã cho. Để làm điều đó, chúng ta sử dụng phương thức const mongoose = require["mongoose"]
const bcrypt = require["bcryptjs"]
const UserSchema = new mongoose.Schema[{
username: String,
password: String
}]
module.exports = mongoose.model["User", UserSchema]
4 MongooseSau khi tìm thấy người dùng, chúng tôi sử dụng phương pháp
const mongoose = require["mongoose"]
const bcrypt = require["bcryptjs"]
const UserSchema = new mongoose.Schema[{
username: String,
password: String
}]
module.exports = mongoose.model["User", UserSchema]
5 mà chúng tôi vừa tạo để xem liệu mật khẩu được cung cấp cho chức năng có khớp với mật khẩu được lưu trữ trong cơ sở dữ liệu hay khôngNếu mật khẩu khớp, kết quả thành công sẽ được trả về bằng chức năng gọi lại. Điều này có nghĩa là nỗ lực đăng nhập đã thành công
Nếu không, một kết quả không thành công sẽ được trả về thay thế
Đó là mã cuối cùng chúng tôi sẽ trình bày trong bài viết này
Chúng tôi đã giới thiệu cách băm mật khẩu và lưu nó vào cơ sở dữ liệu MongoDB bằng Mongoose và Node. js. Và chúng tôi cũng đề cập đến cách kiểm tra các mật khẩu được băm đó để tìm các trận đấu