Selalu gunakan algoritma hashing kata sandi: Argon2 , scrypt , bcrypt atau PBKDF2 .
Argon2 memenangkan kompetisi hashing password 2015. Scrypt , bcrypt dan PBKDF2 adalah algoritma yang lebih tua yang dianggap kurang disukai sekarang, tetapi masih bagus secara fundamental, jadi jika platform Anda belum mendukung Argon2, boleh saja menggunakan algoritma lain untuk saat ini.
Jangan pernah menyimpan kata sandi secara langsung dalam database. Jangan mengenkripsi itu juga: jika tidak, jika situs Anda dilanggar, penyerang mendapatkan kunci dekripsi dan dengan demikian dapat memperoleh semua kata sandi. Kata sandi HARUS di- hash .
Sebuah hash password yang memiliki sifat yang berbeda dari hash table hash atau hash kriptografi. Jangan pernah menggunakan hash kriptografi biasa seperti MD5, SHA-256 atau SHA-512 pada kata sandi. Algoritma hashing kata sandi menggunakan garam , yang unik (tidak digunakan untuk pengguna lain atau dalam basis data orang lain). Garam diperlukan agar penyerang tidak bisa hanya menghitung pra-hash kata sandi yang umum: dengan garam, mereka harus memulai kembali perhitungan untuk setiap akun. Algoritma hashing kata sandi secara intrinsik lambat - selambat yang Anda mampu. Keterlambatan menyakiti penyerang jauh lebih banyak daripada Anda karena penyerang harus mencoba banyak kata sandi yang berbeda. Untuk informasi lebih lanjut, lihat Cara mengamankan kata sandi hash .
Kata sandi hash mengkodekan empat informasi:
- Indikator algoritma yang digunakan. Ini diperlukan untuk kelincahan : rekomendasi kriptografi berubah seiring waktu. Anda harus dapat beralih ke algoritma baru.
- Indikator kesulitan atau kekerasan. Semakin tinggi nilai ini, semakin banyak perhitungan yang dibutuhkan untuk menghitung hash. Ini harus berupa nilai konfigurasi konstan atau global dalam fungsi perubahan kata sandi, tetapi harus meningkat seiring waktu ketika komputer semakin cepat, jadi Anda perlu mengingat nilai untuk setiap akun. Beberapa algoritma memiliki nilai numerik tunggal, yang lain memiliki lebih banyak parameter di sana (misalnya untuk menyetel penggunaan CPU dan penggunaan RAM secara terpisah).
- Garam. Karena garam harus unik secara global, garam harus disimpan untuk setiap akun. Garam harus dibuat secara acak pada setiap perubahan kata sandi.
- Hash yang tepat, yaitu keluaran dari perhitungan matematis dalam algoritma hashing.
Banyak perpustakaan menyertakan fungsi pasangan yang dengan mudah mengemas informasi ini sebagai string tunggal: yang menggunakan indikator algoritma, indikator kekerasan dan kata sandi, menghasilkan garam acak dan mengembalikan string hash penuh; dan yang mengambil kata sandi dan string hash lengkap sebagai input dan mengembalikan boolean yang menunjukkan apakah kata sandi itu benar. Tidak ada standar universal, tetapi penyandian umum adalah
$ algoritma $ parameter $ garam $ output
di mana algorithm
nomor atau string alfanumerik pendek yang mengkodekan pilihan algoritma, parameters
adalah string yang dapat dicetak, dan salt
dan output
dikodekan dalam Base64 tanpa berakhir =
.
16 byte cukup untuk garam dan output. (Lihat misalnya rekomendasi untuk Argon2 .) Disandikan dalam Base64, masing-masing 21 karakter. Dua bagian lainnya bergantung pada algoritma dan parameter, tetapi 20–40 karakter adalah tipikal. Itu total sekitar 82 karakter ASCII ( CHAR(82)
, dan tidak perlu untuk Unicode), yang harus Anda tambahkan margin keamanan jika Anda pikir akan sulit untuk memperbesar bidang nanti.
Jika Anda menyandikan hash dalam format biner, Anda bisa mendapatkannya hingga 1 byte untuk algoritme, 1-4 byte untuk kekerasan (jika Anda meng-hard-code beberapa parameter), dan masing-masing 16 byte untuk garam dan output , dengan total 37 byte. Katakan 40 byte ( BINARY(40)
) untuk memiliki setidaknya beberapa byte cadangan. Perhatikan bahwa ini adalah byte 8-bit, bukan karakter yang dapat dicetak, khususnya bidang dapat menyertakan byte nol.
Perhatikan bahwa panjang hash sama sekali tidak terkait dengan panjang kata sandi.