Saya ingin menyimpan kata sandi hash (menggunakan BCrypt) dalam database. Apa yang akan menjadi tipe yang baik untuk ini, dan mana yang akan menjadi panjang yang benar? Apakah kata sandi hash dengan BCrypt selalu sama panjang?
EDIT
Contoh hash:
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
Setelah membuat beberapa kata sandi, tampaknya BCrypt selalu menghasilkan hash 60 karakter.
EDIT 2
Maaf karena tidak menyebutkan implementasinya. Saya menggunakan jBCrypt .
Jawaban:
Format crypt modular untuk bcrypt terdiri dari
$2$
,$2a$
atau$2y$
mengidentifikasi algoritma dan format hashing$
.
,/
,0
-9
,A
-Z
,a
-z
yang berbeda dengan Basis standar 64 Encoding abjad) yang terdiri dari:Jadi total panjangnya masing-masing adalah 59 atau 60 byte.
Saat Anda menggunakan format 2a, Anda akan membutuhkan 60 byte. Dan karenanya untuk MySQL saya akan merekomendasikan untuk menggunakan
CHAR(60) BINARY
atauBINARY(60)
(lihat The _bin dan Binary Collations untuk informasi tentang perbedaannya).CHAR
tidak biner aman dan kesetaraan tidak hanya bergantung pada nilai byte tetapi pada pemeriksaan yang sebenarnya; dalam kasus terburukA
diperlakukan sama dengana
. Lihat The_bin
andbinary
Collations untuk informasi lebih lanjut.sumber
SQL_Latin1_General_CP1_CS_AS
tidak dikenal di MySQL. Yang diketahui adalahlatin1_general_cs
.2
,2a
dan2y
rata-rata untuk algoritma hashing dan format. Saya tidak dapat menemukan jawaban yang mudah dengan beberapa pencarian.Hash Bcrypt dapat disimpan dalam
BINARY(40)
kolom.BINARY(60)
, seperti yang disarankan oleh jawaban lain, adalah pilihan termudah dan paling alami, tetapi jika Anda ingin memaksimalkan efisiensi penyimpanan, Anda dapat menghemat 20 byte dengan mendekonstruksi hash tanpa kehilangan. Saya telah mendokumentasikan ini lebih menyeluruh di GitHub: https://github.com/ademarre/binary-mcfBcrypt hash mengikuti struktur yang disebut sebagai modular crypt format (MCF). Binary MCF (BMCF) menerjemahkan kode hash ini menjadi struktur biner yang lebih kompak. Dalam kasus Bcrypt, hash biner yang dihasilkan adalah 40 byte.
Gumbo melakukan pekerjaan yang baik untuk menjelaskan empat komponen hash Bcrypt MCF:
Penguraian ke BMCF seperti ini:
$<id>$
dapat direpresentasikan dalam 3 bit.<cost>$
, 04-31, dapat direpresentasikan dalam 5 bit. Masukkan ini bersama-sama selama 1 byte.1 + 16 + 23
Anda dapat membaca lebih lanjut di tautan di atas, atau memeriksa implementasi PHP saya , juga di GitHub.
sumber
Jika Anda menggunakan PHP
password_hash()
denganPASSWORD_DEFAULT
algoritme untuk menghasilkan hash bcrypt (yang saya asumsikan adalah sebagian besar orang yang membaca pertanyaan ini) pastikan untuk diingat bahwa di masa depanpassword_hash()
mungkin menggunakan algoritma yang berbeda sebagai default dan oleh karena itu ini bisa mempengaruhi panjang hash (tetapi mungkin tidak harus lebih lama).Dari halaman manual:
Menggunakan bcrypt, bahkan jika Anda memiliki 1 miliar pengguna (yaitu Anda saat ini bersaing dengan facebook) untuk menyimpan hash kata sandi 255 byte, data itu hanya ~ 255 GB - seukuran hard drive SSD yang lebih kecil. Sangat tidak mungkin menyimpan hash kata sandi akan menjadi hambatan dalam aplikasi Anda. Namun jika ruang penyimpanan benar - benar menjadi masalah karena beberapa alasan, Anda dapat menggunakan
PASSWORD_BCRYPT
untuk memaksapassword_hash()
menggunakan bcrypt, bahkan jika itu bukan default. Pastikan untuk tetap mendapat informasi tentang kerentanan apa pun yang ditemukan di bcrypt dan tinjau catatan rilis setiap kali versi PHP baru dirilis. Jika algoritma default diubah, alangkah baiknya untuk meninjau alasannya dan membuat keputusan berdasarkan informasi apakah akan menggunakan algoritma baru atau tidak.sumber
Saya tidak berpikir bahwa ada trik rapi yang dapat Anda lakukan menyimpan ini seperti yang dapat Anda lakukan misalnya dengan hash MD5.
Saya pikir taruhan terbaik Anda adalah menyimpannya karena
CHAR(60)
selalu 60 karaktersumber