Kata Sandi Anda: Praktik Terbaik?

162

Saya selalu penasaran ... Mana yang lebih baik ketika memberi salin kata sandi untuk hashing: awalan, atau postfix? Mengapa? Atau apakah itu penting, asalkan Anda asin?

Untuk menjelaskan: Kita semua (semoga) tahu sekarang bahwa kita harus memberi garam kata sandi sebelum kita hash untuk penyimpanan dalam database [ Sunting: Jadi Anda dapat menghindari hal-hal seperti apa yang terjadi pada Jeff Atwood baru-baru ini ]. Biasanya ini dilakukan dengan menggabungkan garam dengan kata sandi sebelum meneruskannya melalui algoritma hashing. Tetapi contohnya bervariasi ... Beberapa contoh menambahkan garam sebelum kata sandi. Beberapa contoh menambahkan garam setelah kata sandi. Saya bahkan melihat beberapa yang mencoba untuk meletakkan garam di tengah.

Jadi metode mana yang lebih baik, dan mengapa? Apakah ada metode yang mengurangi kemungkinan tabrakan hash? Googling saya belum menemukan analisis yang layak tentang masalah ini.

Sunting: Jawaban yang bagus, teman-teman! Maaf saya hanya bisa memilih satu jawaban. :)

Randolpho
sumber
1
@Jaccco: input luar biasa. Terima kasih!
Randolpho
3
Praktik terbaik adalah menggunakan fungsi kriptografi yang melakukan salting untuk Anda, menggunakan PBKDF2 (standar), bcrypt atau bahkan scrypt. Terima kasih kepada Stephen karena menunjukkan hal itu.
Maarten Bodewes
1
Hampir semua konstruksi hashing kata sandi standar mengombinasikan garam dan kata sandi, jadi Anda tidak perlu khawatir tentang hal ini. Jika Anda tidak menggunakan hash kata sandi standar, bermigrasi ke satu.
CodesInChaos
1
@Omu Rekomendasi buruk. 1) Satu iterasi tunggal SHA-1 terlalu cepat, Anda harus menggunakan setidaknya 10.000, dan bahkan itu cukup lemah. 2) Garam standar terlalu kecil. Minimal 8 byte dan 16 direkomendasikan.
CodesInChaos

Jawaban:

111

Awalan atau akhiran tidak relevan, ini hanya tentang menambahkan beberapa entropi dan panjang kata sandi.

Anda harus mempertimbangkan tiga hal berikut:

  1. Garam harus berbeda untuk setiap kata sandi yang Anda simpan. (Ini adalah kesalahpahaman yang cukup umum.)
  2. Gunakan penghasil angka acak yang aman secara kriptografis.
  3. Pilih garam yang cukup panjang. Pikirkan tentang masalah ulang tahun.

Ada jawaban yang sangat baik oleh Dave Sherohman untuk pertanyaan lain mengapa Anda harus menggunakan garam yang dihasilkan secara acak alih-alih nama pengguna (atau data pribadi lainnya). Jika Anda mengikuti saran itu, tidak masalah di mana Anda memasukkan garam.

Georg Schölly
sumber
4
Saya telah menambahkan tautan ke pertanyaan lama, baca jawaban itu. Pada dasarnya, dengan tidak menggunakan garam acak berbeda per kata sandi, Anda mengambil risiko keamanan yang tidak perlu, yang mungkin menjadi masalah nyata di masa depan.
Georg Schölly
39
Garam acak di seluruh situs buruk, karena penyerang dapat melakukan precompute tabel pelangi dan mengambil seluruh database pengguna Anda. Jika Anda tidak memahami hal ini, jangan tulis sistem masuk / keamanan :) - Anda MEMBUTUHKAN garam per pengguna.
snemarch
3
Ya, garam per pengguna. Idealnya, dengan iterasi per pengguna disimpan (sehingga Anda dapat meningkatkan jumlah iterasi yang digunakan seiring waktu). Kerangka kerja yang layak akan memiliki bawaan ini. (NET memiliki PasswordDeriveBytes yang akan menangani semuanya untuk Anda.)
MichaelGG
2
Jika Anda merancang segala jenis sistem keamanan, itu otaknya tidak menggunakan garam per-pengguna. Anda situs mungkin tidak super-menarik, tapi mempertimbangkan pengguna menggunakan password yang sama di beberapa situs Web ... berusaha untuk menjaga database aman cenderung gagal :)
snemarch
2
Tentu saja garam melindungi terhadap serangan kamus, justru dengan membuatnya lebih lambat. Penggunaan garam dalam kata sandi jauh sebelum tabel pelangi. Garam ditambahkan secara khusus untuk memperlambat serangan kamus, dengan mencegah penyerang membuat kata sandi sekali lalu membandingkannya dengan semua pengguna.
Glenn Maynard
27

Saya pikir itu semua semantik. Menempatkannya sebelum atau sesudah tidak masalah kecuali terhadap model ancaman yang sangat spesifik.

Fakta bahwa itu ada di sana seharusnya mengalahkan tabel pelangi.

Model ancaman yang saya singgung adalah skenario di mana musuh dapat memiliki tabel pelangi dari garam biasa yang ditambahkan / ditambahkan ke kata sandi. (Katakan NSA) Anda menduga mereka telah menambahkan atau menambahkan tetapi tidak keduanya. Itu konyol, dan itu dugaan yang buruk.

Akan lebih baik untuk berasumsi bahwa mereka memiliki kapasitas untuk menyimpan tabel pelangi ini, tetapi tidak, katakanlah, tabel dengan garam aneh diselingi di tengah kata sandi. Dalam bahwa kasus sempit, saya akan menduga bahwa diselingi akan menjadi yang terbaik.

Seperti yang saya katakan. Itu semantik. Pilih garam berbeda per kata sandi, garam panjang, dan sertakan karakter aneh di dalamnya seperti simbol dan kode ASCII: © ¤¡

Tom Ritter
sumber
@ sendirian, sial! Dia menemukan garam 'passwordsalt' saya!
Samuel
6
@Samuel: Saya tidak tahu tentang kalian, tapi kami menggunakan '12345' untuk garam kami. :)
Randolpho
@adalah satu valid. Saya benar-benar berarti "umum" sebagai "semua garam dengan panjang X dalam karakteret Y" di mana X, Y masuk akal; katakanlah 20 karakter dan alfanumerik huruf besar / kecil. Diperpanjang untuk mengatakan semua string heksadesimal bawah panjang Z (mengatakan 160) karena saya pikir meja pelangi hash hash akan berguna ..
Tom Ritter
1
@ Randolpho: Hei, itu garam saya juga! Apa peluangnya?
Adrien
Dan pastikan garamnya tidak dapat diprediksi / Acak: stackoverflow.com/questions/1645161/…
Jacco
18

Jawaban sebenarnya, yang tampaknya tidak disentuh oleh siapa pun, adalah bahwa keduanya salah . Jika Anda menerapkan crypto Anda sendiri, tidak peduli seberapa sepele bagian yang Anda pikir Anda lakukan, Anda akan membuat kesalahan.

HMAC adalah pendekatan yang lebih baik, tetapi bahkan jika Anda menggunakan sesuatu seperti SHA-1, Anda sudah memilih algoritma yang tidak cocok untuk hashing kata sandi karena desainnya untuk kecepatan. Gunakan sesuatu seperti bcrypt atau mungkin scrypt dan singkirkan masalah sepenuhnya dari tangan Anda.

Oh, dan bahkan tidak berpikir tentang membandingkan hash yang dihasilkan untuk kesetaraan dengan bahasa pemrograman Anda atau utilitas perbandingan string basis data. Mereka membandingkan karakter dengan karakter dan hubungan pendek seolah- falseolah karakter berbeda. Jadi sekarang penyerang dapat menggunakan metode statistik untuk mencoba dan mencari tahu apa hash itu, sebuah karakter sekaligus.

Stephen Touset
sumber
1
Mengenai paragraf terakhir: bagaimana penyerang bisa mendapatkan info tentang jumlah karakter yang tepat perbandingan telah gagal? Ini tidak masuk akal ..
halloweenlv
1
Anda berdua benar dan salah. Serangan waktu adalah nyata dan telah berulang kali terbukti layak dengan akurasi yang menakutkan bahkan melalui koneksi jaringan variabel-latensi untuk menentukan dengan tepat di mana perbandingan gagal. Yang mengatakan, serangan waktu tidak benar-benar berlaku untuk hash kata sandi umum, karena itu tidak layak secara komputasi untuk menemukan input yang hanya mengubah sebagian kecil dari output.
Stephen Touset
9

Seharusnya tidak ada bedanya. Hash tidak akan lagi mudah ditebak di mana pun Anda meletakkan garam. Tabrakan hash jarang terjadi dan tidak dapat diprediksi, berdasarkan sengaja non-linear. Jika itu membuat perbedaan pada keamanan, itu akan menyarankan masalah dengan hashing, bukan pengasinan.

Phil H
sumber
1
Tabrakan hash tergantung pada ukuran hash. Berkat tabrakan masalah ulang tahun sangat mungkin.
Georg Schölly
2
Hanya jika Anda memotong hasilnya. Lagi pula, saya masih berdiri pada titik bahwa itu tidak akan membuat perbedaan di mana garamnya, karena titik hash adalah membuat hubungan antara input dan output tidak mengandung pola.
Phil H
7

Jika menggunakan hash yang aman secara kriptografis, itu tidak masalah apakah Anda melakukan pre atau postfix; titik hashing adalah bahwa perubahan bit tunggal dalam data sumber (di mana pun) harus menghasilkan hash yang berbeda.

Namun yang penting adalah menggunakan garam panjang, menghasilkannya dengan PRNG kriptografi yang tepat, dan memiliki garam per pengguna. Menyimpan garam per-user dalam database Anda tidak masalah keamanan, menggunakan hash situs-lebar adalah .

snemarch
sumber
2
Anwser salah: penyerang dapat melakukan precompute MD (pass) untuk banyak password yang sering digunakan dan kemudian menghitung MD (pass + salt) dengan sangat murah karena intisari pesan berfungsi dengan cara tambahan sehingga dapat mendukung streaming.
Erwan Legrand
5

Pertama-tama, istilah "meja pelangi" secara konsisten disalahgunakan. Tabel "pelangi" hanyalah jenis tabel pencarian tertentu, yang memungkinkan jenis kompresi data tertentu pada tombol. Dengan memperdagangkan komputasi untuk ruang, tabel pencarian yang membutuhkan 1.000 TB dapat dikompresi ribuan kali sehingga dapat disimpan pada drive drive yang lebih kecil.

Anda harus khawatir tentang tabel pencarian hash ke kata sandi, pelangi atau sebaliknya.

@ onebyone.livejournal.com:

Penyerang memiliki 'rainbow tables' yang terdiri bukan hash dari kata-kata kamus, tetapi dari kondisi perhitungan hash sebelum menyelesaikan perhitungan hash.

Maka bisa lebih murah untuk memaksa entri file kata sandi dengan garam postfix daripada garam prefix: untuk setiap kata kamus Anda akan memuat negara, menambahkan byte garam ke dalam hash, dan kemudian menyelesaikannya. Dengan garam awalan tidak akan ada kesamaan antara perhitungan untuk setiap kata kamus.

Untuk fungsi hash sederhana yang memindai secara linear melalui string input, seperti generator kongruensier sederhana, ini adalah serangan praktis. Tetapi fungsi hash yang aman secara kriptografis sengaja dirancang untuk memiliki beberapa putaran, yang masing-masing menggunakan semua bit dari string input, sehingga menghitung keadaan internal sesaat sebelum penambahan garam tidak berarti setelah putaran pertama. Sebagai contoh, SHA-1 memiliki 80 putaran.

Selain itu algoritma hashing kata sandi seperti PBKDF menyusun fungsi hash mereka beberapa kali (disarankan untuk mengulangi PBKDF-2 minimal 1000 kali, setiap iterasi menerapkan SHA-1 dua kali) membuat serangan ini dua kali lipat tidak praktis.

cygil
sumber
Anda harus memeriksa deskripsi putaran. Putaran-putaran tersebut berdasarkan per bagian, bukan keseluruhan pesan. (Kalau tidak, hashing data streaming akan membutuhkan rewinding lagi dan lagi.) Tetapi menggunakan iterasi tidak mencegah masalah yang disebutkan oleh seseorang.
MichaelGG
4

BCrypt hash jika platform memiliki penyedia. Saya suka bagaimana Anda tidak khawatir tentang membuat garam dan Anda bisa membuatnya lebih kuat jika Anda mau.

Samuel
sumber
3
Sejauh yang saya tahu, BCrypt Hash perlu pengasinan, seperti skema hashing lainnya.
Jacco
2

Memasukkan garam jumlah karakter yang sewenang-wenang ke dalam kata sandi adalah kasus yang paling tidak diharapkan, dan karena itu yang paling "aman" secara sosial, tapi itu benar-benar tidak terlalu signifikan dalam kasus umum selama Anda menggunakan kata sandi yang panjang dan unik per kata sandi string untuk garam.

jeffcook2150
sumber