Cara Hash dan Verifikasi Kata Sandi di Node.js Dengan bcrypt
Table of content:
Salah satu cara terbaik untuk menyimpan kata sandi dengan aman adalah dengan memberi garam dan hash. Salting dan hashing mengubah kata sandi biasa menjadi nilai unik yang sulit dibalik. Pustaka Bcrypt memungkinkan Anda melakukan hash dan garam kata sandi di Node.js dengan sedikit usaha.
Apa Itu Pencirian Kata Sandi?
Pencirian kata sandi berarti melewatkan kata sandi teks biasa melalui algoritme hashing untuk menghasilkan nilai unik. Nilai unik ini disebut hash. Beberapa contoh algoritma hashing adalah bcrypt, scrypt, dan SHA.
Salah satu sifat utama dari algoritma hashing yang baik adalah menghasilkan output yang sama untuk input yang sama. Prediktabilitas ini membuat hash rentan terhadap serangan brute-force. Seorang peretas dapat melakukan pra-komputasi nilai hash untuk banyak masukan yang umum digunakan dan kemudian membandingkannya dengan nilai hash dalam nilai target. Anda dapat mengurangi kerentanan ini menggunakan pengasinan.
Apa itu Pengasinan Kata Sandi?
Pengasinan kata sandi menambahkan string acak (garam) ke kata sandi sebelum melakukan hashing. Dengan cara ini, hash yang dihasilkan akan selalu berbeda setiap waktu. Bahkan jika seorang peretas mendapatkan kata sandi hash, mereka akan membutuhkan banyak waktu untuk menemukan kata sandi asli yang membuatnya.
Cara Menggunakan Bcrypt untuk Mencirikan dan Memverifikasi Kata Sandi
bcrypt adalah modul npm yang menyederhanakan cara Anda melakukan hash kata sandi di Node.js. Untuk menggunakannya, ikuti langkah-langkah di bawah ini:
Langkah 1: Instal Bcrypt
Instal bcrypt dengan menjalankan perintah terminal berikut.
Menggunakan npm:
npm install bcrypt
Menggunakan benang:
yarn add bcrypt
Langkah 2: Impor Bcrypt
Di bagian atas file JavaScript Anda, impor Bcrypt.
const bcrypt = require("bcrypt")
Langkah 3: Hasilkan Garam
Panggil bcrypt.genSalt() metode untuk menghasilkan garam. Metode ini menerima nilai integer yang merupakan faktor biaya yang menentukan waktu yang dibutuhkan untuk hash password. Semakin tinggi faktor biaya, semakin banyak waktu yang dibutuhkan algoritme dan semakin sulit untuk membalikkan kata sandi terenkripsi menggunakan kekerasan.
Nilai yang baik harus cukup tinggi untuk mengamankan kata sandi tetapi juga cukup rendah agar tidak memperlambat proses. Biasanya berkisar antara 5 dan 15. Dalam tutorial ini, kita akan menggunakan 10.
bcrypt.genSalt(10, (err, salt) => {
})
Langkah 4: Hash Kata Sandi
Dalam bcrypt.genSalt fungsi, berikan kata sandi biasa dan garam yang dihasilkan ke bcrypt.hash() metode untuk hash kata sandi.
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(plaintextPassword, salt, function(err, hash) {
});
})
Setelah Anda membuat hash, simpan di database. Anda akan menggunakannya untuk memverifikasi kata sandi dan mengautentikasi pengguna yang mencoba masuk.
Alih-alih membuat garam dan hash secara terpisah, Anda juga dapat membuat garam dan hash secara otomatis menggunakan satu fungsi.
bcrypt.hash(plaintextPassword, 10, function(err, hash) {
});
Langkah 5: Bandingkan Kata Sandi Menggunakan bcrypt
Untuk mengautentikasi pengguna, Anda perlu membandingkan kata sandi yang mereka berikan dengan yang ada di database menggunakan bcrypt.bandingkan() fungsi. Fungsi ini menerima kata sandi teks biasa dan hash yang Anda simpan, bersama dengan fungsi panggilan balik. Callback itu memasok objek yang berisi kesalahan apa pun yang terjadi, dan hasil keseluruhan dari perbandingan. Jika kata sandi cocok dengan hash, hasilnya benar.
bcrypt.compare(plaintextPassword, hash, function(err, result) {
if (result) {
}
});
Menggunakan Async/Menunggu
Anda dapat mengenkripsi kata sandi di Node.js dengan Bcrypt menggunakan async/menunggu sebagai berikut.
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;
}
Menggunakan Janji
Pustaka bcrypt juga mendukung penggunaan janji. Misalnya, berikut adalah fungsi yang meng-hash kata sandi menggunakan blok then…catch.
function hashPassword(plaintextPassword) {
bcrypt.hash(plaintextPassword, 10)
.then(hash => {
})
.catch(err => {
console.log(err)
})
}
Demikian pula, fungsi ini membandingkan kata sandi biasa dari pengguna dengan kata sandi hash menggunakan janji.
function comparePassword(plaintextPassword, hash) {
bcrypt.compare(plaintextPassword, hash)
.then(result => {
return result
})
.catch(err => {
console.log(err)
})
}
Hashing dan Salting Adalah Kemenangan yang Mudah
Anda dapat menggunakan perpustakaan Bcrypt untuk melakukan hash dan memverifikasi kata sandi di Node.js. Hashing kata sandi meminimalkan kemungkinan penjahat dunia maya mengakses kata sandi biasa dan menggunakannya untuk mengakses data atau layanan sensitif.
Salting kata sandi hash Anda membuatnya lebih aman. Selain hashing, selalu validasikan kekuatan kata sandi sebagai langkah keamanan tambahan.