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 có 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 đã 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 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
}
})
}
}) 3Đâ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 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
}
})
}
}) 4const 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
}
})
}
}) 5Đầ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 để 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 phần mềm trung gian trước 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 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
}
})
}
}) 1Đây là chức năng phần mềm trung gian 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 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
}
})
}
}) 3Để bạn tham khảo, mã cho toàn bộ mô hình Mongoose mẫu sẽ như thế này 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
}
})
}
}) 9Bâ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 đố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 chức năng, 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 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
}
})
}
}) 31const 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 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
}
})
}
}) 34 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 thức 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 để thực hiện việc này bằng phương phá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
}
})
}
}) 36 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à 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
}
})
}
}) 37. Nếu không, nó sẽ 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
}
})
}
}) 38 để 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 tôi tạo hai biến có 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
}
})
}
}) 39 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
}
})
}
}) 40const 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
}
})
}
}) 39 đạ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 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
}
})
}
}) 40 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 hà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
}
})
}
}) 43 để so sánh 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
}
})
}
}) 44 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
}
})
}
}) 40 với nhau. Nó có chức năng gọi lại trả về kết quả boolean (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
}
})
}
}) 37 hoặ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
}
})
}
}) 38) cho biết mật khẩu có khớp hay khôngCuối cùng, chúng tôi sử 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
}
})
}
}) 48 để 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 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
}
})
}
}) 49 để 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 gọi 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
}
})
}
}) 50 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 hàm, đ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 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
}
})
}
}) 54 MongooseSau khi tìm thấy người dùng, chúng tôi sử dụng phương phá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
}
})
}
}) 55 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 những gì đượ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
Làm cách nào để đặt thông tin đăng nhập MongoDB?
Cách bật xác thực trong MongoDB . Tạo quản trị viên trong cơ sở dữ liệu quản trị với vai trò userAdminAnyDatabase. . Ngắt kết nối khỏi vỏ mongo ( Ctrl+D ) Định vị đoạn mã sau trong tệp cấu hình mongod ( /etc/mongod. . Thay đổi ủy quyền bị vô hiệu hóa thành được kích hoạt và lưu tệp
Bộ sưu tập nào sau đây lưu trữ thông tin xác thực trong MongoDB?
bộ sưu tập người dùng trong cơ sở dữ liệu quản trị lưu trữ thông tin ủy quyền và xác thực người dùng. |