Mật khẩu MongoDB được lưu trữ ở đâ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

  • Mật khẩu MongoDB được lưu trữ ở đâu

    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
      }
    })
  }
})
7

Biế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ẩu

Vì 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ạo

bcrypt.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 ta

Khi 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ệu

Bấ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ới

Bê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ào

Sau đó, 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ôi

Khi 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
      }
    })
  }
})
0

Mã 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
  }
})
7

Trong 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ước

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 đạ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ệu

Bê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
1

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

Đ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ồm

Sau đó, 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ệu

Trướ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ạn

Sau 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ùng

Sau đó, 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ông

Cuố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ông

Nế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
      }
    })
  }
})
3

Phươ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
      }
    })
  }
})
4

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 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
      }
    })
  }
})
5

Trong 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ạn

Bê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 Mongoose

Sau 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ông

Nế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ôi có thể khôi phục mật khẩu quản trị viên MongoDB của mình?

Bạn có thể đặt lại mật khẩu quản trị viên bằng cách thực hiện theo các bước bên dưới. .
Chỉnh sửa /opt/bitnami/mongodb/mongodb. conf và thay thế các dòng sau. # Bật/tắt bảo mật. .
Khởi động lại máy chủ MongoDB. cd /opt/bitnami Sudo /opt/bitnami/ctlscript. sh khởi động lại mongodb
Tạo người dùng quản trị mới với mật khẩu mới

Làm thế nào mật khẩu được lưu trữ trong DB?

Một phần cơ bản của bảo mật mật khẩu, về mặt lưu trữ cơ sở dữ liệu, được gọi là hàm băm . Hàm băm là một hàm phức tạp thay đổi mật khẩu văn bản thành một bộ ký tự phức tạp hơn bằng cách sử dụng các phép toán phức tạp hơn phép toán quen thuộc như phép nhân.

Làm cách nào để thay đổi mật khẩu cơ sở dữ liệu MongoDB?

Làm cách nào để thay đổi mật khẩu cho người dùng MongoDB? .
sử dụng quản trị viên. db. changeUserPassword("tom", "mật khẩu bí mật")
sử dụng quản trị viên. db. changeUserPassword("tom", passwordPrompt())
Nhập mật khẩu

Lưu trữ mật khẩu trong MongoDB có an toàn không?

Mặc dù bảo mật mặc định của MongoDB dựa trên các tiêu chuẩn công nghiệp hiện đại, chẳng hạn như TLS cho lớp truyền tải và SCRAM-SHA-2356 để trao đổi mật khẩu, ai đó vẫn có thể lấy được . .