Peta data panjang berubah -ubah ke data panjang tetap: Bermakna bahawa ruang mesej input boleh "tak terhingga", tetapi ruang output tidak. Ini mempunyai implikasi bahawa 2 atau lebih mesej input boleh mempunyai hash yang sama. Semakin kecil ruang output, semakin besar kebarangkalian 'perlanggaran' antara dua mesej input.
Hakikat bahawa output fungsi hash tidak boleh kembali ke input menggunakan algoritma yang cekap tidak bermakna ia tidak boleh retak. Pangkalan data yang mengandungi hash kata -kata biasa dan rentetan pendek biasanya dalam jangkauan kami dengan carian Google yang mudah. Juga, rentetan biasa boleh dengan mudah dan cepat-cepat dipaksa atau retak dengan serangan kamus.
Berikut adalah video cepat tentang bagaimana alat seperti SQLMAP boleh memecahkan kata laluan melalui suntikan SQL dengan hash bruteforcing MD5 dalam pangkalan data.
Juga, kita hanya boleh melakukan serangan yang paling mudah ... hanya ambil hash dan Google itu ... kemungkinan bahawa hash wujud dalam pangkalan data dalam talian. Contoh pangkalan data hash adalah:
kita juga perlu mempertimbangkan bahawa sejak 2 atau lebih kata laluan yang sama akan mempunyai nilai hash yang sama, memecahkan satu hash secara automatik akan memberi anda kata laluan setiap pengguna yang menggunakannya sama. Hanya untuk menjadi jelas, katakan anda mempunyai beribu -ribu pengguna, kemungkinan besar jumlahnya akan digunakan (jika dasar kata laluan tidak dikuatkuasakan) kata laluan '123456' yang terkenal. Nilai hash MD5 kata laluan itu ialah 'E10ADC3949BA59ABBE56E057F20F883E', jadi apabila anda memecahkan hash ini (jika anda perlu) dan mencari semua pengguna yang mempunyai nilai ini dalam medan kata laluan mereka, anda akan tahu bahawa setiap satu daripada mereka menggunakannya Kata laluan '123456'.
Untuk mengurangkan serangan ini, garam menjadi biasa tetapi jelas tidak mencukupi untuk kuasa pengkomputeran hari ini, terutama jika tali garam pendek, yang menjadikannya kasar.
fungsi kata laluan/garam asas ditakrifkan sebagai:f (kata laluan, garam) = hash (garam kata laluan)
Untuk mengurangkan serangan kekerasan, garam harus selagi 64 aksara, bagaimanapun, untuk mengesahkan pengguna kemudian, garam mesti disimpan dalam teks biasa di dalam pangkalan data, jadi:
<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
<span>Generate some string or get entry from dictionary </span><span>Concatenate with salt </span><span>Apply hash algorithm </span><span>If generated hash == hash in database then Bingo </span><span>else continue iterating</span>
Untuk menghasilkan garam yang baik, kita harus mempunyai penjana nombor rawak yang baik. Jika Rand PHP () berfungsi secara automatik muncul dalam fikiran anda, lupakannya dengan segera.
Terdapat artikel yang sangat baik mengenai Randomness in Random.org. Ringkasnya, komputer tidak boleh berfikir data rawak dengan sendirinya. Komputer dikatakan sebagai mesin deterministik, yang bermaksud bahawa setiap algoritma tunggal komputer dapat dijalankan, memandangkan input yang sama, akan selalu menghasilkan output yang sama.
Apabila nombor rawak diminta ke komputer, ia biasanya mendapat input dari beberapa sumber, seperti pembolehubah persekitaran (tarikh, masa, # bait bacaan/ditulis, uptime ...), kemudian gunakan beberapa pengiraan pada mereka untuk menghasilkan data rawak . Inilah sebab mengapa data rawak yang diberikan oleh algoritma dipanggil rawak pseudo dan oleh itu penting untuk membezakan dari sumber data rawak yang benar. Sekiranya kita entah bagaimana dapat mencipta semula keadaan yang tepat pada masa pelaksanaan penjana nombor pseudo-rawak (atau PRNG), kita secara automatik akan mempunyai nombor yang dihasilkan asal.
Selain itu, jika PRNG tidak dilaksanakan dengan betul, adalah mungkin untuk menemui corak dalam data yang dihasilkan. Jika corak wujud, kita boleh meramalkan hasilnya ... mengambil contohnya fungsi Rand () PHP pada Windows seperti yang didokumenkan di sini. Walaupun tidak jelas versi PHP atau Windows yang digunakan, anda boleh memberitahu ada sesuatu yang salah dengan melihat bitmap yang dihasilkan dengan menggunakan rand ():
Walaupun isu ini telah ditangani pada php> = 5, rand () dan juga mt_rand () masih dianggap sangat tidak mencukupi untuk tujuan berkaitan keselamatan.
Jika anda perlu menjana data rawak, sila gunakan openssl_random_pseudo_bytes () yang tersedia seperti Php 5> = 5.3.0, ia juga mempunyai bendera crypto_strong yang akan memberitahu anda jika bait itu cukup selamat.
Berikut adalah sampel kod cepat untuk menghasilkan rentetan rawak menggunakan openssl_random_pseudo_bytes ()
regangan kata laluan boleh berkesan jika dilakukan dengan betul
<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
Algoritma ini harus berulang cukup untuk melakukan semua pengiraan dalam sekurang -kurangnya 1 saat (hashing yang lebih perlahan juga bermakna penyerang perlu menunggu).
Ini membuat serangan tidak mungkin ... tetapi tidak mustahil. Untuk mengatasi kelewatan 1 saat, penyerang harus mempunyai spesifikasi perkakasan yang lebih tinggi daripada komputer yang mana algoritma itu ditala, sesuatu yang mungkin bermakna kos yang tinggi, jadi serangan itu menjadi mahal.
anda juga boleh menggunakan algoritma standard, seperti pbkdf2 yang merupakan fungsi derivasi utama berasaskan kata laluan
<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
<span>Generate some string or get entry from dictionary </span><span>Concatenate with salt </span><span>Apply hash algorithm </span><span>If generated hash == hash in database then Bingo </span><span>else continue iterating</span>
Faktor beban kerja bergantung sepenuhnya kepada sistem sasaran. Anda boleh memulakan dengan faktor '09' dan meningkatkannya sehingga operasi selesai dengan lebih kurang. 1 saat.
Sehingga Php 5> = 5.5.0 anda boleh menggunakan fungsi password_hash () baru, yang menggunakan bcrypt sebagai kaedah lalai untuk hashing.
Tidak ada sokongan scrypt dalam PHP lagi, tetapi anda boleh menyemak pelaksanaan Scrypt Domblack.
bagaimana dengan menggunakan teknik penyulitan?
enkripsi ) adalah istilah yang sering dikelirukan. Seperti yang saya nyatakan sebelum ini, hashing adalah fungsi pseudo-rawak, manakala cyphering umumnya adalah 'permutasi pseudo-rawak' . Ini bermakna mesej input dihiris dan diubah sedemikian rupa sehingga output tidak dapat dibezakan dari trng, namun output dapat diubah kembali ke input asal. Transformasi ini dilakukan dengan menggunakan kunci penyulitan, tanpa itu mustahil untuk mengubah output ke dalam mesej asal sekali lagi. ciphering mempunyai perbezaan besar lain berbanding hashing. Walaupun ruang mesej output hashing adalah terhingga, ruang mesej output ciphering tidak terhingga, kerana hubungan antara input dan output adalah 1: 1, oleh itu perlanggaran tidak boleh wujud.
seseorang harus berhati -hati dengan cara menggunakan teknik penyulitan dengan betul, memikirkan bahawa hanya dengan menggunakan algoritma penyulitan kepada data sensitif cukup untuk memastikan ia selamat dianggap salah, kerana banyak masalah yang boleh menyebabkan kebocoran data. Sebagai peraturan umum, anda tidak boleh mempertimbangkan untuk menggunakan pelaksanaan penyulitan anda sendiri
Baru -baru ini, Adobe mempunyai kebocoran data besar -besaran pangkalan data pengguna mereka, kerana mereka salah menggunakan teknik penyulitan dan saya akan mengambilnya sebagai contoh apa yang tidak perlu dilakukan. Saya akan cuba untuk menjadi lurus ke hadapan yang mungkin, menjaga perkara yang sangat mudah.
Pertimbangkan skema berikut:
katakan kandungan teks biasa jadual adalah seperti berikut:
Sekarang, seseorang di Adobe memutuskan untuk memujuk kata laluan, tetapi membuat dua kesilapan besar:
katakan contohnya, selepas menggunakan algoritma penyebaran ke medan kata laluan, kini data kami kelihatan seperti berikut:
Rekod 6 petunjuk adalah
"Saya satu!" Yang tidak memberi kita banyak maklumat, namun rekod 3 rekod ... kita dapat dengan selamat meneka bahawa kata laluan adalah "ratu". Rekod 2 dan 7 petunjuk tidak memberi banyak maklumat sahaja, tetapi jika kita melihatnya bersama, berapa banyak cuti yang mempunyai nama yang sama seperti filem menakutkan? Sekarang kita mempunyai akses kepada akaun semua orang yang menggunakan "Halloween" sebagai kata laluan.
Untuk mengurangkan risiko kebocoran data, lebih baik untuk beralih kepada teknik hashing, namun jika anda mesti menggunakan teknik penyulitan untuk menyimpan kata laluan, kami boleh menggunakan penyulitan tweakable. Istilah ini kelihatan mewah, tetapi sangat mudah.katakan kami mempunyai beribu -ribu pengguna, dan kami ingin menyulitkan semua kata laluan. Seperti yang kita lihat, kita tidak boleh menggunakan kunci penyulitan yang sama untuk setiap kata laluan kerana data akan mengalami risiko (dan serangan canggih yang lain menjadi mungkin). Walau bagaimanapun, kami tidak boleh menggunakan kunci yang unik untuk setiap pengguna, kerana menyimpan kunci tersebut akan menjadi risiko keselamatan dengan sendirinya. Apa yang perlu kita lakukan ialah menghasilkan satu kunci dan menggunakan
'tweak' yang akan menjadi unik kepada setiap pengguna, dan kedua -dua kunci dan tweak bersama -sama akan menjadi kunci penyulitan untuk setiap rekod. Yang paling mudah tweak yang tersedia adalah kunci utama, yang secara definisi adalah unik untuk setiap rekod dalam jadual (walaupun saya tidak mengesyorkan untuk menggunakannya, ini hanya untuk menunjukkan konsep):
f (kunci, primaryKey) = Key PrimaryKeyDi atas saya hanya menggabungkan kedua -dua kunci penyulitan dan nilai kunci utama untuk menghasilkan kunci penyulitan akhir, namun anda boleh (
dan harus ) menggunakan algoritma hashing atau fungsi derivasi utama kepada mereka. Juga, bukannya menggunakan kunci utama sebagai tweak, anda mungkin ingin menjana nonce (serupa dengan garam) untuk setiap rekod untuk digunakan sebagai tweak.
Setelah menggunakan penyulitan tweakable ke jadual pengguna, kini kelihatan seperti berikut:
Sudah tentu kita masih mempunyai masalah petunjuk kata laluan, tetapi sekarang setiap rekod mempunyai nilai yang unik, jadi tidak jelas yang pengguna menggunakan kata laluan yang sama.
Saya ingin menekankan bahawa penyulitan bukan penyelesaian terbaik, dan harus dielakkan jika mungkin untuk menyimpan kata laluan kerana banyak kelemahan dapat disuntik ... Anda boleh dan harus berpegang pada penyelesaian yang terbukti (seperti bcrypt) untuk menyimpan kata laluan, tetapi Perlu diingat bahawa walaupun penyelesaian yang terbukti mempunyai kelemahan mereka.
Tidak ada penyelesaian yang sempurna dan risiko seseorang melanggar langkah -langkah keselamatan kita tumbuh setiap hari. Walau bagaimanapun, kajian kriptografi dan keselamatan data dan penyelidikan berterusan, dengan definisi baru -baru ini mengenai fungsi span, toolkit kami terus berkembang setiap hari.
Hashing dan penyulitan kata laluan adalah dua kaedah yang berbeza yang digunakan untuk menjamin data, tetapi mereka berfungsi dengan tujuan yang berbeza. Penyulitan adalah fungsi dua hala; Apa yang disulitkan boleh disahsulit dengan kunci yang betul. Ini bermakna jika seseorang mendapat akses kepada kunci penyulitan, mereka boleh menyahsulit data. Sebaliknya, hashing adalah fungsi sehala yang menggosok teks biasa untuk menghasilkan mesej yang unik. Malah perubahan kecil dalam input akan menghasilkan perubahan drastik dalam output yang nilai hash baru tidak akan menyerupai yang lama. Ini menjadikannya mustahil untuk menjana semula data asal dari nilai hash, menjadikan hashing lebih selamat untuk menyimpan kata laluan. digunakan sebagai input tambahan kepada fungsi sehala yang mempunyai data, kata laluan atau frasa laluan. Garam digunakan untuk melindungi kata laluan dalam simpanan. Fungsi utama garam adalah untuk mempertahankan serangan kamus atau terhadap serangan meja pelangi yang telah dipasang. Dengan menambah garam yang unik, hash menjadi unik kepada setiap pengguna, walaupun dua pengguna mempunyai kata laluan yang sama. Ini bermakna walaupun penggodam mempunyai akses kepada nilai hash, mereka tidak dapat memecahkan kata laluan tanpa garam yang unik.
Mengapa penting untuk menjaga rahsia algoritma hashing? Pastikan rahsia algoritma hashing, tidak semestinya mungkin, terutamanya dengan algoritma yang digunakan secara meluas. Keselamatan sistem hashing yang baik tidak bergantung pada kerahsiaan algoritma; Sebaliknya, ia bergantung kepada kerahsiaan dan kekangan garam yang ditambah kepada hash. Walaupun penyerang mengetahui algoritma, tanpa garam, mereka tidak boleh membalikkan kata laluan dari hash. sebagai garam rahsia yang kedua, ditambah untuk meningkatkan keselamatan kata laluan yang disimpan. Walaupun garam biasanya disimpan dalam pangkalan data bersebelahan kata laluan hashed, lada disimpan rahsia dan disimpan secara berasingan, selalunya dalam kod aplikasi. Ini bermakna bahawa walaupun penyerang memperoleh akses ke pangkalan data, tanpa lada, mereka tidak dapat memecahkan kata laluan. atau mengubah algoritma hashing bergantung kepada beberapa faktor, termasuk kepekaan data yang anda lindungi dan keadaan teknologi semasa. Sebagai peraturan, jika algoritma hashing yang lebih selamat diterima secara meluas, atau jika kelemahan didapati dalam algoritma semasa, sudah tiba masanya untuk dikemas kini. Sentiasa terus maklumat mengenai perkembangan terkini dalam kriptografi untuk memastikan keselamatan maksimum.
Atas ialah kandungan terperinci Risiko dan cabaran hashing kata laluan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!