Saya tidak yakin bagaimana cara kerja hashing kata sandi (akan mengimplementasikannya nanti), tetapi perlu membuat skema basis data sekarang.
Saya berpikir untuk membatasi kata sandi menjadi 4-20 karakter, tetapi seperti yang saya pahami setelah mengenkripsi string hash akan memiliki panjang yang berbeda.
Jadi, bagaimana cara menyimpan kata sandi ini dalam database?
Update: Hanya menggunakan fungsi hash tidak cukup kuat untuk menyimpan password. Anda harus membaca jawaban dari Gilles di thread ini untuk penjelasan lebih rinci.
Untuk password, menggunakan kunci-memperkuat algoritma hash seperti Bcrypt atau Argon2i. Misalnya, di PHP, gunakan password_hash() fungsi, yang menggunakan Bcrypt secara default.
$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
Hasilnya adalah 60-karakter string yang mirip dengan berikut ini (tapi angka akan bervariasi, karena itu menghasilkan yang unik garam).
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
Gunakan tipe data SQL CHAR(60)
untuk menyimpan encoding ini dari Bcrypt hash. Catatan fungsi ini doesn't encode sebagai string dari digit heksadesimal, sehingga kita bisa't sebagai mudah unhex untuk menyimpan dalam biner.
Lainnya fungsi hash masih memiliki kegunaan, namun tidak untuk menyimpan password, jadi saya'll keep asli jawabannya di bawah ini, yang ditulis pada tahun 2008.
Hal ini tergantung pada algoritma hashing yang anda gunakan. Hashing selalu menghasilkan hasil yang sama panjang, terlepas dari masukan. Hal ini khas untuk mewakili biner hash akibat dalam teks, sebagai rangkaian dari digit heksadesimal. Atau anda dapat menggunakan UNHEX()
fungsi untuk mengurangi string hex digit setengahnya.
Pada 2015, NIST merekomendasikan menggunakan SHA-256 atau lebih tinggi untuk setiap aplikasi fungsi hash yang membutuhkan interoperabilitas. Tapi NIST tidak merekomendasikan menggunakan ini sederhana fungsi hash untuk menyimpan password dengan aman.
Kurang hashing algoritma memiliki kegunaan (seperti internal untuk aplikasi, tidak untuk interchange), tetapi mereka dikenal crackable.
Anda dapat benar-benar menggunakan CHAR(panjang hash) untuk menentukan tipe data pada MySQL karena masing-masing algoritma hashing akan selalu mengevaluasi keluar ke nomor yang sama dari karakter. Misalnya, SHA1 selalu kembali 40-karakter heksadesimal nomor.
Anda mungkin menemukan artikel Wikipedia ini tentang salting berharga. Idenya adalah menambahkan sedikit data untuk mengacak nilai hash Anda; ini akan melindungi kata sandi Anda dari serangan kamus jika seseorang mendapatkan akses tidak sah ke hash kata sandi.
Sebagai string dengan panjang tetap (VARCHAR(n) atau bagaimanapun MySQL menyebutnya). Sebuah hash selalu memiliki panjang tetap misalnya 12 karakter (tergantung pada algoritma hash yang Anda gunakan). Jadi kata sandi 20 karakter akan dikurangi menjadi hash 12 karakter, dan kata sandi 4 karakter juga akan menghasilkan hash 12 karakter.
Argon2 memenangkan 2015 hashing password kompetisi. Scrypt, bcrypt dan PBKDF2 lebih tua algoritma yang dianggap kurang disukai sekarang, tapi masih fundamental suara, jadi jika platform anda doesn't dukungan Argon2 namun, hal's ok untuk menggunakan algoritma lain untuk sekarang.
Jangan pernah menyimpan password langsung di database. Don't mengenkripsi itu, kedua: sebaliknya, jika situs anda mendapatkan dilanggar, penyerang mendapatkan kunci dekripsi sehingga bisa mendapatkan semua password. Password HARUS hashed.
Sebuah kata-sandi hash memiliki sifat yang berbeda dari tabel hash hash atau hash kriptografi. Pernah menggunakan aplikasi yang biasa kriptografi hash seperti MD5, SHA-256 atau SHA-512 password. Password hashing algoritma menggunakan salt, yang unik (tidak digunakan untuk setiap pengguna lainnya atau pada orang lain's database). Garam diperlukan sehingga penyerang dapat't hanya pra-menghitung hash dari password yang umum: dengan garam, mereka harus me-restart perhitungan untuk setiap akun. Password hashing algoritma intrinsically slow — lambat seperti yang anda mampu. Kelambatan sakit penyerang lebih banyak dari anda karena penyerang telah mencoba banyak password yang berbeda. Untuk informasi lebih lanjut, lihat Cara aman hash password.
Password hash encode empat potongan informasi:
Banyak perpustakaan termasuk sepasang fungsi-fungsi yang terletak paket informasi ini sebagai sebuah string tunggal: satu yang mengambil algoritma indikator, kekerasan indikator dan password, menghasilkan garam acak dan mengembalikan penuh hash string; dan salah satu yang mengambil password dan penuh hash string sebagai input dan mengembalikan nilai boolean yang menunjukkan apakah password sudah benar. Ada's tidak ada standar universal, tetapi yang umum adalah encoding
$algorithm$parameters$salt$output
mana algoritma
adalah jumlah atau pendek alfanumerik string encoding pilihan algoritma, parameter
adalah string cetak, dan garam
dan output
dikodekan dalam Base64 tanpa menghentikan =
.
16 byte yang cukup untuk garam dan output. (Lihat misalnya rekomendasi untuk Argon2.) Dikodekan dalam Base64, yang's 21 karakter masing-masing. Dua bagian lain tergantung pada algoritma dan parameter, tapi 20-40 karakter yang khas. Yang's total sekitar 82 karakter ASCII (CHAR(82)
, dan tidak perlu untuk Unicode), yang anda harus menambahkan margin keamanan jika anda pikir itu's akan menjadi sulit untuk memperbesar lapangan nanti.
Jika anda menyandikan hash dalam format biner, anda bisa mendapatkan ke bawah untuk 1 byte untuk algoritma, 1-4 byte untuk kekerasan (jika anda keras-kode beberapa parameter), dan 16 byte masing-masing untuk garam dan output, untuk total 37 byte. Katakan 40 byte (BINER(40)
) untuk memiliki setidaknya beberapa spare byte. Perhatikan bahwa ini adalah 8-bit byte, bukan karakter yang dapat dicetak, khususnya bidang dapat mencakup null byte.
Perhatikan bahwa panjang hash adalah benar-benar tidak terkait dengan panjang password.
Hash adalah urutan bit (128-bit, 160 bit, 256 bit, dll., tergantung pada algoritma). Kolom anda harus binary-diketik, bukan teks/karakter yang diketik, jika MySQL memungkinkan (SQL Server datatype adalah biner(n)
atau varbinary(n)
). Anda juga harus garam hash. Garam dapat teks atau biner, dan anda akan membutuhkan kolom yang sesuai.
Anda harus menggunakan TEKS
(menyimpan terbatas jumlah karakter) demi kompatibilitas maju. Hashing algoritma (harus) menjadi lebih kuat dari waktu ke waktu dan dengan demikian database ini lapangan akan perlu untuk mendukung lebih banyak karakter dari waktu ke waktu. Selain itu tergantung pada strategi migrasi anda mungkin perlu untuk toko baru dan lama hash di bidang yang sama, sehingga memperbaiki panjang untuk salah satu jenis hash ini tidak dianjurkan.
Itu benar-benar tergantung pada algoritma hashing anda're menggunakan. Panjang password memiliki sedikit untuk melakukan dengan panjang hash, jika saya ingat dengan benar. Melihat spesifikasi pada algoritma hashing anda menggunakan, menjalankan beberapa tes, dan memotong tepat di atas itu.
Saya selalu menguji untuk menemukan panjang string MAX dari string terenkripsi dan menetapkannya sebagai panjang karakter tipe VARCHAR. Tergantung pada berapa banyak record yang akan Anda miliki, itu benar-benar dapat membantu ukuran database.