Apakah lebih aman untuk hash kata sandi beberapa kali?

43

Saya telah membaca beberapa kali ketika menyimpan kata sandi, praktik yang baik untuk 'menggandakan hash' string (mis. Dengan md5 lalu sha1, keduanya dengan garam, jelas).

Saya kira pertanyaan pertama adalah, "Apakah ini benar?" Jika tidak, maka tolong abaikan sisa pertanyaan ini :)

Alasan saya bertanya adalah karena itu, saya akan mengatakan bahwa ini masuk akal. Namun, ketika saya berpikir tentang hal itu, setiap kali hash diulang (mungkin dengan sesuatu ditambahkan ke dalamnya) yang bisa saya lihat adalah bahwa ada pengurangan batas atas pada 'keunikan' akhir ... yang terikat terkait dengan input awal.

Biarkan saya katakan dengan cara lain: kita memiliki x jumlah string yang, ketika hash, dikurangi menjadi y string yang mungkin. Artinya, ada tabrakan di set pertama. Sekarang datang dari set kedua ke set ketiga, apakah tidak mungkin terjadi hal yang sama (mis. Tabrakan pada set semua string 'y' yang mungkin menghasilkan hash yang sama pada set ketiga)?

Di kepala saya, yang saya lihat adalah 'corong' untuk setiap panggilan fungsi hash, 'corong' sekumpulan kemungkinan yang tak terbatas ke dalam himpunan terbatas dan seterusnya, tapi jelas setiap panggilan bekerja pada himpunan terbatas sebelum itu, memberi kita atur tidak lebih besar dari input.

Mungkin contoh akan menjelaskan ocehan saya? Ambil 'hash_function_a' yang akan memberikan 'a' dan 'b' hash '1', dan akan memberikan 'c' dan 'd' hash '2'. Menggunakan fungsi ini untuk menyimpan kata sandi, meskipun kata sandinya 'a', saya bisa menggunakan kata sandi 'b'.

Ambil 'hash_function_b' yang akan memberikan '1' dan '2' hash '3'. Jika saya menggunakan itu sebagai 'hash sekunder' setelah 'hash_function_a' kemudian bahkan jika password adalah 'a' Aku bisa menggunakan 'b', 'c' atau 'd'.

Di atas semua itu, saya mendapatkan bahwa garam harus digunakan, tetapi mereka tidak benar-benar mengubah fakta bahwa setiap kali kita memetakan input 'x' menjadi 'kurang dari x'. Saya tidak berpikir.

Bisakah seseorang tolong jelaskan kepada saya apa yang saya lewatkan di sini?

Terima kasih!

EDIT: untuk apa nilainya, saya tidak melakukan ini sendiri, saya menggunakan bcrypt. Dan saya tidak benar-benar khawatir tentang apakah itu berguna untuk 'menggunakan siklus' untuk seorang 'hacker'. Saya benar-benar hanya bertanya-tanya apakah proses tersebut mengurangi 'keamanan' dari titik tabrakan hash.

Narsisis
sumber
2
@ S.Lott: Saya tidak benar-benar melihat bagaimana itu menjawab pertanyaan yang sebenarnya, meskipun ... semua yang dikatakannya adalah "jangan lakukan sendiri, gunakan hal ini" atau "itu baik untuk mengambil waktu!". .. tak satu pun dari jawaban itu "apakah sebenarnya lebih aman". Sekali lagi, kecuali saya kehilangan sesuatu.
Narcissus
@MetalMikester: Ya, itu adalah artikel kemarin: thedailywtf.com/Articles/Bulletproof-Encryption.aspx
FrustratedWithFormsDesigner
Ini bukan topik untuk Keamanan IT, tetapi sepertinya cocok untuk Kriptografi. Bahkan, ini terlihat sangat mirip dengan pertanyaan ini di sana .
Saya tahu perusahaan yang ingin menggunakan tanpa garam MD5(password). Kami mengatakan itu tidak aman, jadi mereka menyarankan menggunakan MD5(MD5(password))...
konfigurator
Jawaban yang diterima bukan jawaban yang benar!
markus

Jawaban:

27

Ini lebih cocok untuk security.stackexchange tapi ...

Masalah dengan

hash1(hash2(hash3(...hashn(pass+salt)+salt)+salt)...)+salt)

adalah bahwa ini hanya sekuat fungsi hash terlemah dalam rantai. Sebagai contoh jika hashn (hash paling dalam) memberikan tabrakan, seluruh rantai hash akan memberikan tabrakan ( terlepas dari apa hash lain dalam rantai ).

Rantai yang lebih kuat akan menjadi

hash1(hash2(hash3(...hashn(pass + salt) + pass + salt) + pass + salt)...) + pass + salt)

Di sini kita menghindari masalah tabrakan awal dan pada dasarnya kita menghasilkan garam yang tergantung pada kata sandi untuk hash terakhir.

Dan jika satu langkah dalam rantai bertabrakan, itu tidak masalah karena pada langkah berikutnya kata sandi digunakan lagi dan harus memberikan hasil yang berbeda untuk kata sandi yang berbeda.

ratchet freak
sumber
Jadi sekarang saya melihat bahwa menambahkan "kata sandi + garam" sebagai garam ke babak hashing berikutnya mungkin meningkatkan jumlah 'barang' yang bisa masuk ke corong, sekarang saya hanya perlu memahami dengan 'berapa banyak'. Terima kasih.
Narcissus
Sebenarnya saya rasa saya mengerti sekarang: dengan memaksa kata sandi ke setiap lapisan hashing, apakah ini sebenarnya mengurangi jumlah kemungkinan tabrakan dengan pada dasarnya membutuhkan 'kata sandi bertabrakan' dan kata sandi asli untuk memiliki hash yang cocok di setiap 'panggilan' benar Saya berpikir bahwa saya kehilangan bagian 'masukkan kata sandi di setiap lapisan'! Terima kasih lagi.
Narcissus
@Narcissus no prob dan itu juga memiliki bonus untuk memungkinkan hash dalam yang lebih lemah (selama hash luar / akhir kuat) karena hash dalam hanya menghasilkan garam untuk pass berikutnya
ratchet freak
hum, saya pikir masalahnya sedikit lebih besar (dan lebih dalam) dari itu. Dengan serangan pelangi, Anda bisa membuat tabel dengan mempertimbangkan semua hash Anda, dan masalahnya tetap ada.
woliveirajr
4
@ Narcissus: dalam jawaban yang sangat singkat: Ya, itu tidak lebih aman. Ya, mungkin itu bahkan kurang aman.
woliveirajr
54

Menggunakan algoritma hashing yang berbeda adalah ide yang buruk - itu akan mengurangi entropi daripada meningkatkannya.

Namun, dengan asumsi Anda memiliki algoritma hashing kriptografi yang kuat dan garam yang baik, menerapkan fungsi hash yang sama beberapa kali membuat proses hashing lebih mahal secara komputasi. Manfaat dari hal ini adalah bahwa ketika cara lain untuk memecahkan hash kata sandi gagal (menebak, serangan kamus, tabel pelangi, dll.), Dan penyerang dipaksa ke dalam teknik brute-force, dibutuhkan waktu lebih lama untuk mencoba setiap kata sandi, hanya karena mereka harus menerapkan fungsi hash yang sama lebih sering. Jadi, jika satu putaran hashing akan membutuhkan satu bulan brute-forcing, menerapkannya dua belas kali akan menambah perkiraan waktu menjadi satu tahun.

Algoritma hashing terbaru seperti bcrypt membangun ide ini; mereka berisi parameter untuk mengontrol kerumitan komputasi hash, sehingga Anda dapat mengaturnya seiring kecepatan perangkat keras: ketika perangkat keras menjadi lebih cepat dengan faktor dua, Anda meningkatkan kompleksitas untuk mengkompensasi, sehingga waktu yang dibutuhkan untuk memaksa Anda memaksa hash tetap konstan.

tammmer
sumber
2
Ini jawaban yang benar!
Markus
@markus: sesuai dengan diskusi yang saya baca, ini hanya benar karena penambahan "dan garam yang baik" yang ditangani oleh jawaban yang diterima, bukan? Mengapa yang ini benar dan jawaban yang diterima tidak?
Narcissus
Ini adalah jawaban yang benar karena satu-satunya alasan untuk menerapkan fungsi hashing yang sama beberapa kali (parameter) adalah bahwa Anda dapat menggunakan iterasi ini untuk menyesuaikan perangkat keras yang lebih cepat. Kalau tidak, tidak ada manfaat dari hashing beberapa kali.
markus
@ Narcissus Kuncinya di sini adalah entropi. Ada perbedaan antara hashing berkali-kali menggunakan metode yang sama dibandingkan hashing berkali-kali menggunakan metode yang berbeda.
sakisk
3

Jangan mencoba untuk menulis skema hashing kata sandi Anda sendiri kecuali Anda bersedia mengambil kursus dalam kriptografi dan / atau teknik keamanan.

Anda harus menggunakan implementasi hashing kata sandi yang mapan yang pada gilirannya harus menggunakan fungsi derivasi kunci ( KDF ) seperti PBKDF2, bcrypt, scrypt atau Argon2 yang lebih baru.

KDF yang baik termasuk workfactor, biasanya sejumlah iterasi, untuk meningkatkan biaya serangan offline. Orang bisa mengatakan bahwa KDF ini meng-hash kata sandi beberapa kali, menggunakan algoritma yang sama setiap kali. Tidak ada gunanya menggunakan beberapa algoritma intisari pesan, seperti yang ditunjukkan oleh orang lain.

Erwan Legrand
sumber
1
tautan https://crackstation.net/hashing-security.htm diblokir oleh firewall
gnat
1
@gnat Untuk beberapa alasan, saya melewatkan komentar Anda tentang URL yang diblokir. Saya telah menggantinya dengan tautan ke wikipedia.
Erwan Legrand
2

Secara umum, Anda tidak perlu menggunakan lebih dari satu algoritma hashing.

Yang perlu Anda lakukan adalah:

Gunakan garam: garam tidak digunakan hanya untuk membuat kata sandi Anda lebih aman , itu digunakan untuk menghindari serangan tabel pelangi. Dengan begitu, seseorang akan memiliki pekerjaan yang lebih sulit untuk mencoba menghitung hash untuk kata sandi yang Anda simpan di sistem Anda.

Gunakan beberapa interasi: alih-alih hanya melakukan SHA (kata sandi + garam), lakukan SHA (SHA (SHA (SHA (SHA (... SHA (kata sandi + garam)))))))). Atau, untuk mewakili dengan cara lain:

hash = sha(password + salt)
for i=1 , i=5000, i++ {
    hash = sha(hash + salt);
}

Dan, akhirnya, pilih fungsi hashing yang bagus. SHA, MD5, dll, tidak bagus karena mereka terlalu cepat . Karena Anda ingin menggunakan hash untuk perlindungan, Anda sebaiknya menggunakan hash yang lebih lambat. Lihatlah Bcrypt , PBKDF2 atau Scrypt , misalnya.

sunting : setelah pengamatan, mari kita coba untuk melihat beberapa poin (maaf, penjelasan panjang sampai akhir, karena mungkin membantu orang lain mencari jawaban yang sama):

Jika sistem Anda aman, seperti tidak ada yang akan pernah mendapatkan akses ke kata sandi yang disimpan, Anda tidak akan perlu hash. Kata sandi akan dirahasiakan, tidak ada yang akan mendapatkannya.

Tetapi tidak ada yang bisa memastikan bahwa database dengan kata sandi akan dicuri. Curi databasenya, dapatkan semua kata sandinya. Oke, sistem Anda dan perusahaan Anda akan menanggung semua akibatnya. Jadi, kita bisa mencoba menghindari kebocoran kata sandi ini.

PEMBERITAHUAN bahwa kami tidak khawatir tentang serangan online dalam hal ini. Untuk satu serangan online, solusi terbaik adalah memperlambat setelah kata sandi buruk, mengunci akun setelah beberapa kali mencoba, dll. Dan untuk itu tidak masalah ke arah mana Anda mengenkripsi, hash, menyimpan, dll, kata sandi Anda. Serangan online adalah masalah memperlambat input kata sandi .

Jadi, kembali ke don't let them take my plain passwordsmasalahnya. Jawabannya sederhana: jangan menyimpannya sebagai teks biasa. OK mengerti.

Bagaimana cara menghindarinya?

Enkripsi kata sandi (?). Tapi, seperti yang Anda tahu, jika Anda mengenkripsi, Anda dapat mendekripsi kembali, jika Anda memiliki kunci yang tepat. Dan Anda akan berakhir dengan masalah "di mana menyembunyikan" kuncinya. Hum, tidak bagus, karena mereka punya Anda basis data, mereka bisa mendapatkan kunci Anda. Ok, jangan digunakan.

Jadi, pendekatan lain: mari kita ubah kata sandi dalam sesuatu yang lain yang tidak dapat dibalik dan simpan. Dan untuk memverifikasi apakah kata sandi yang diberikan benar, kami melakukan proses yang sama lagi dan memeriksa apakah kedua nilai yang diubah cocok. Jika mereka cocok = kata sandi yang baik diberikan.

Ok, sejauh ini bagus. Mari kita gunakan beberapa hash MD5 dalam kata sandi. Tetapi ... jika seseorang memiliki nilai kata sandi hash yang tersimpan, ia dapat memiliki banyak daya komputer untuk menghitung hash MD5 dari setiap kata sandi yang mungkin (brute force), sehingga ia dapat menemukan kata sandi asli. Atau, yang terburuk, ia dapat menyimpan semua MD5 dari semua kombinasi karakter, dan dengan mudah menemukan kata sandi. Jadi, lakukan banyak iteractions, HASH (HASH (HASH ())), untuk membuatnya lebih sulit, karena itu akan membutuhkan lebih banyak waktu.

Tetapi bahkan itu bisa dilewati, meja pelangi diciptakan tepat untuk mempercepat terhadap perlindungan semacam ini.

Jadi, mari kita gunakan garam di atasnya. Dengan cara ini, pada setiap interaksi, garam digunakan lagi. Seseorang yang mencoba menyerang kata sandi Anda harus membuat tabel pelangi mengingat garam ditambahkan setiap kali. Dan ketika dia membuat tabel pelangi itu, karena dihasilkan dengan satu garam, dia harus menghitung lagi dengan garam yang lain, jadi dia harus meluangkan waktu untuk setiap kata sandi (= setiap garam). Garam tidak akan menambahkan "lebih banyak kerumitan" pada kata sandi, itu hanya akan membuat penyerang kehilangan waktu membuat tabel pelangi, jika Anda menggunakan satu garam untuk setiap kata sandi, tabel dari satu garam tidak berguna untuk kata sandi lain.

Dan menggunakan lebih dari satu hash akan membantu di sini? Tidak. Orang yang menghasilkan serangan pelangi tertentu akan dapat membuatnya menggunakan satu atau lebih hash.

Dan menggunakan lebih dari satu hash dapat menuntun Anda ke satu masalah: ini seaman hash terlemah yang Anda gunakan. Jika seseorang menemukan tabrakan dalam satu algoritma hash, hash itu yang akan dieksploitasi, pada titik mana pun dari proses iterasi, untuk memecahkan kata sandi. Jadi, Anda tidak mendapatkan apa pun dengan menggunakan lebih banyak algoritma hash, lebih baik memilih hanya satu algo yang bagus. dan gunakan itu. Dan jika Anda pernah mendengar bahwa itu telah rusak, pikirkan bagaimana Anda akan mengubahnya di aplikasi Anda.

Dan mengapa menggunakan bcrypt atau sesuatu seperti itu (Anda mengatakan Anda menggunakannya): karena penyerang harus menghabiskan lebih banyak waktu membuat tabel. Itu sebabnya menggunakan MD5 + tunggu (3 detik) tidak membantu: serangan akan offline, jadi penyerang dapat menghasilkan tabel tanpa (penundaan 3 detik).

woliveirajr
sumber
2
Ups! Maaf, komentar saya (tentang sengaja membuat hash lebih lambat melalui parameter timeout) tidak dimaksudkan untuk dianggap serius ... Saya pikir saya telah membaca terlalu banyak Dilbert belakangan ini.
FrustratedWithFormsDesigner
2
sha (sha (sha (..)))) tidak lebih aman daripada sha. Jika entropi fungsi sha tidak maksimal, ini sebenarnya kurang aman.
deadalnix
1
@deadalnix: penting untuk menyebutkan bahwa itu tidak membuatnya lebih mudah untuk memulihkan kata sandi yang asli, tetapi itu membuatnya lebih mudah untuk menghasilkan kata sandi yang bertabrakan, hanya itu yang diperlukan.
Bryan Boettcher
1
@deadalnix, saya membaca komentar itu dengan suara Dale Gribble .
jiggy
1
@deadalnix: tujuan sha (sha (sha ())) tidak, dan tidak pernah ada, untuk menambahkan lebih banyak entropi. Entropy hanya dibuat oleh pengguna awal memilih kata sandinya, yang lainnya (hash, salt, dll) hanya untuk memperlambat serangan brute-force. Jika seseorang bisa mendapatkan basis data Anda yang berisi kata sandi, ia mungkin akan mendapatkan kode yang digunakan untuk hash kata sandi juga, sehingga setiap garam yang dikodekan juga dikenal
woliveirajr
-1

Pemahaman saya adalah bahwa menggunakan beberapa algoritma hashing adalah untuk mengalahkan tabel pelangi . Menggunakan garam yang baik juga bisa, tetapi saya rasa ini adalah tingkat perlindungan kedua.

jiggy
sumber
4
Yah ini tidak banyak berubah. Fungsi «banyak hash» dapat dilihat sebagai satu dan diperlakukan seperti itu.
deadalnix
2
Menggunakan beberapa teknik hashing atau iterasi tidak akan mengalahkan tabel pelangi. Jika penyerang memiliki database Anda, dan memiliki metode yang digunakan untuk menghasilkan hash, penyerang kemudian dapat menghasilkan tabel pelangi untuk menyerang semua kata sandi dalam database. SALTS mencegah serangan tabel pelangi karena mencegah penyerang membuat kamus pencarian tunggal untuk menyerang, katakanlah, semua kata sandi 8 karakter atau kurang.
Erik
-1

Ini tidak lebih aman. Namun, Anda memiliki protokol identifikasi berdasarkan hash beberapa kali dengan fungsi yang sama.

Ini jalannya. Nilai yang disimpan adalah hash ^ n (lulus) di komputer A. A meminta B untuk mengotentikasi dan memberikan B integer n. B melakukan hash perhitungan ^ (n-1) (lulus) dan mengirimkannya kembali ke A.

Pemeriksaan yang hash (hash ^ (n-1) (pass)) == hash ^ n (pass). Jika itu benar, maka otentikasi dilakukan. Tapi kemudian, hash toko ^ (n-1) (lulus) dan otentikasi berikutnya, akan memberikan B n-1 sebagai ganti n.

Ini memastikan bahwa kata sandi tidak pernah dipertukarkan dengan jelas, bahwa A tidak pernah tahu apa kata sandinya, dan bahwa otentikasi dilindungi oleh ulangan. Namun, ini memiliki kelemahan untuk meminta kata sandi dengan masa pakai yang terbatas. Ketika n mencapai nilai 2, kata sandi baru harus dipilih setelah otentikasi.

Penggunaan lain dari beberapa hash adalah alat HMAC, untuk memastikan otentikasi dan integritas permintaan. Untuk informasi lebih lanjut tentang HMAC, lihat http://en.wikipedia.org/wiki/HMAC .

Sebagian besar penggunaan banyak hash di dunia nyata terlalu banyak. Dalam kasus Anda, sepertinya begitu. Perhatikan bahwa jika Anda menggunakan beberapa fungsi hash, semuanya tidak akan memiliki entropi yang sama, sehingga ini mengurangi kekuatan hash. Sebagai contoh, md5 memiliki entropi lebih sedikit daripada sha1, jadi menggunakan sha1 pada md5 tidak akan meningkatkan kekuatan hash. Kekuatan umumnya akan sama dengan kekuatan fungsi hash yang lebih lemah.

deadalnix
sumber