Cách sử dụng thư viện bcrypt JavaScript

Tìm hiểu cách băm và kiểm tra mật khẩu trong JavaScript với thư viện bcrypt

Gói bcrypt npm là một trong những gói được sử dụng nhiều nhất để làm việc với mật khẩu trong JavaScript.

Đây là bảo mật 101, nhưng điều đáng nói đối với các nhà phát triển mới: bạn không bao giờ lưu mật khẩu ở dạng văn bản thuần túy trong cơ sở dữ liệu hoặc ở bất kỳ nơi nào khác. Bạn chỉ là không.

Thay vào đó, những gì bạn làm là tạo một băm từ mật khẩu và lưu trữ nó.

Theo cách này:

import bcrypt from 'bcrypt'
// or
// const bcrypt = require('bcrypt')

const password = 'oe3im3io2r3o2'
const rounds = 10

bcrypt.hash(password, rounds, (err, hash) => { if (err) { console.error(err) return } console.log(hash) })

Bạn chuyển một số làm đối số thứ hai và số đó càng lớn thì hàm băm càng an toàn. Nhưng cũng mất nhiều thời gian để tạo ra nó.

Thư viện README cho chúng ta biết rằng trên lõi 2GHz, chúng ta có thể tạo ra:

rounds=8 : ~40 hashes/sec
rounds=9 : ~20 hashes/sec
rounds=10: ~10 hashes/sec
rounds=11: ~5  hashes/sec
rounds=12: 2-3 hashes/sec
rounds=13: ~1 sec/hash
rounds=14: ~1.5 sec/hash
rounds=15: ~3 sec/hash
rounds=25: ~1 hour/hash
rounds=31: 2-3 days/hash

If you run bcrypt.hash() multiple times, the result will keep changing. This is key because there is no way to reconstruct the original password from a hash.

Given the same password and a hash it’s possible to find out if the hash was built from that password, using the bcrypt.compare() function:

bcrypt.compare(password, hash, (err, res) => {
  if (err) {
    console.error(err)
    return
  }
  console.log(res) //true or false
})

If so, the password matches the hash and for example we can let a user log in successfully.

You can use the bcrypt library with its promise-based API too, instead of callbacks:

const hashPassword = async () => {
  const hash = await bcrypt.hash(password, rounds)
  console.log(hash)
  console.log(await bcrypt.compare(password, hash))
}

hashPassword()

Check a couple examples in this Glitch:


More js tutorials: