Saya tidak yakin bagaimana hashing kata sandi berfungsi (akan mengimplementasikannya nanti), tetapi perlu membuat skema basis data sekarang.
Saya berpikir untuk membatasi kata sandi hingga 4-20 karakter, tetapi seperti yang saya mengerti setelah mengenkripsi string hash akan memiliki panjang yang berbeda.
Jadi, bagaimana cara menyimpan kata sandi ini di basis data?
Jawaban:
Pembaruan: Cukup menggunakan fungsi hash tidak cukup kuat untuk menyimpan kata sandi. Anda harus membaca jawaban dari Gilles di utas ini untuk penjelasan yang lebih terperinci.
Untuk kata sandi, gunakan algoritma hash penguatan kunci seperti Bcrypt atau Argon2i. Misalnya, dalam PHP, gunakan fungsi password_hash () , yang menggunakan Bcrypt secara default.
Hasilnya adalah string 60 karakter yang mirip dengan yang berikut (tetapi digit akan bervariasi, karena menghasilkan garam yang unik).
Gunakan tipe data SQL
CHAR(60)
untuk menyimpan pengodean Bcrypt hash ini. Perhatikan bahwa fungsi ini tidak disandikan sebagai untaian digit heksadesimal, jadi kita tidak dapat dengan mudah menghapusnya untuk disimpan dalam biner.Fungsi hash lainnya masih memiliki kegunaan, tetapi tidak untuk menyimpan kata sandi, jadi saya akan menyimpan jawaban asli di bawah ini, yang ditulis pada tahun 2008.
Itu tergantung pada algoritma hashing yang Anda gunakan. Hashing selalu menghasilkan hasil dengan panjang yang sama, terlepas dari inputnya. Merupakan ciri khas untuk merepresentasikan hasil hash biner dalam teks, sebagai rangkaian digit heksadesimal. Atau Anda dapat menggunakan
UNHEX()
fungsi ini untuk mengurangi string angka heks menjadi setengahnya.Pada 2015, NIST merekomendasikan penggunaan SHA-256 atau lebih tinggi untuk aplikasi fungsi hash yang memerlukan interoperabilitas. Tetapi NIST tidak merekomendasikan penggunaan fungsi hash sederhana ini untuk menyimpan kata sandi dengan aman.
Algoritma hashing yang lebih kecil memiliki kegunaannya (seperti internal untuk suatu aplikasi, bukan untuk pertukaran), tetapi mereka dikenal dapat crackable .
sumber
Anda benar-benar dapat menggunakan
CHAR
(panjang hash) untuk menentukan tipe data Anda untuk MySQL karena setiap algoritma hashing akan selalu mengevaluasi ke jumlah karakter yang sama. Misalnya,SHA1
selalu mengembalikan angka heksadesimal 40 karakter.sumber
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:
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
di mana
algorithm
nomor atau string alfanumerik pendek yang mengkodekan pilihan algoritma,parameters
adalah string yang dapat dicetak, dansalt
danoutput
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.
sumber
Anda mungkin menemukan artikel Wikipedia ini tentang pengasinan yang bermanfaat . Idenya adalah menambahkan sedikit data untuk mengacak nilai hash Anda; ini akan melindungi kata sandi Anda dari serangan kamus jika seseorang mendapat akses tanpa izin ke hash kata sandi.
sumber
Sebagai string panjang tetap (VARCHAR (n) atau bagaimanapun MySQL menyebutnya). Hash selalu memiliki panjang tetap misalnya 12 karakter (tergantung pada algoritma hash yang Anda gunakan). Jadi kata sandi 20 char akan dikurangi menjadi hash 12 char, dan password 4 char juga akan menghasilkan hash 12 char.
sumber
Anda harus menggunakan
TEXT
(menyimpan karakter dalam jumlah tidak terbatas) demi kompatibilitas ke depan. Algoritma Hashing (perlu) menjadi lebih kuat dari waktu ke waktu dan dengan demikian bidang basis data ini perlu mendukung lebih banyak karakter dari waktu ke waktu. Selain itu tergantung pada strategi migrasi Anda, Anda mungkin perlu menyimpan hash baru dan lama di bidang yang sama, jadi tidak disarankan untuk memperbaiki panjang ke satu jenis hash.sumber
Ini sangat tergantung pada algoritma hashing yang Anda gunakan. Panjang kata sandi tidak ada hubungannya dengan panjang hash, jika saya ingat dengan benar. Cari spesifikasi pada algoritma hashing yang Anda gunakan, jalankan beberapa tes, dan potong tepat di atas itu.
sumber
Hash adalah urutan bit (128 bit, 160 bit, 256 bit, dll., Tergantung pada algoritma). Kolom Anda harus bertipe biner, bukan tipe teks / karakter, jika MySQL mengizinkannya (tipe data SQL Server adalah
binary(n)
atauvarbinary(n)
). Anda juga harus menggarami hash. Garam bisa berupa teks atau biner, dan Anda akan membutuhkan kolom yang sesuai.sumber
Saya selalu diuji untuk menemukan panjang string MAX dari string terenkripsi dan menetapkan itu sebagai panjang karakter dari tipe VARCHAR. Bergantung pada berapa banyak catatan yang akan Anda miliki, ini bisa sangat membantu ukuran database.
sumber
untuk md5 vARCHAR (32) sesuai. Bagi yang menggunakan AES lebih baik menggunakan varbinary.
sumber