Rumah > pembangunan bahagian belakang > tutorial php > Risiko dan cabaran hashing kata laluan

Risiko dan cabaran hashing kata laluan

尊渡假赌尊渡假赌尊渡假赌
Lepaskan: 2025-02-22 08:36:11
asal
798 orang telah melayarinya

Risiko dan cabaran hashing kata laluan

Takeaways Key

Hashing adalah fungsi sehala yang memetakan data-panjang data untuk output panjang tetap, tetapi algoritma hashing mudah seperti MD5 dan SHA-1 terdedah kepada serangan akibat kelemahan yang diketahui dan kemungkinan perlanggaran. Fungsi Satu Jalan: Output tidak boleh diterbalikkan menggunakan algoritma yang cekap.

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.

    MD5 telah mengesahkan perlanggaran praktikal dan kebarangkalian SHA1 untuk mencapai perlanggaran berkembang setiap hari (lebih lanjut mengenai kebarangkalian perlanggaran dapat dijumpai dengan menganalisis masalah ulang tahun klasik), jadi jika kita perlu menggunakan algoritma hashing, kita harus menggunakan yang mempunyai ruang output yang lebih besar (dan kebarangkalian perlanggaran yang tidak dapat dielakkan), seperti SHA256, SHA512, Whirlpool, dan lain -lain ...
  • Mereka juga dipanggil 'fungsi pseudo-rawak', yang bermaksud bahawa output fungsi hashing harus tidak dapat dibezakan dari penjana nombor rawak yang benar (atau trng).
  • mengapa hashing mudah tidak selamat untuk menyimpan kata laluan

    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.

    Demonstrasi

    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:

    • http://www.hash-database.net/
    • https://isc.sans.edu/tools/hashsearch.html
    • http://md5online.net/
    • https://crackstation.net/

    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'.

    mengapa hash asin tidak selamat untuk menyimpan kata laluan

    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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Oleh kerana setiap pengguna akan mempunyai garam yang sama sekali berbeza, ini juga mengelakkan masalah dengan hash mudah, di mana kita dapat dengan mudah memberitahu jika 2 atau lebih pengguna menggunakan kata laluan yang sama; Sekarang hash akan berbeza. Kami juga tidak lagi boleh mengambil kata laluan hash secara langsung dan cuba google. Juga, dengan garam yang panjang, serangan kekerasan adalah mustahil. Tetapi, jika penyerang mendapat akses kepada garam ini sama ada dengan serangan suntikan SQL atau akses langsung ke pangkalan data, serangan kekerasan atau serangan kamus menjadi mungkin, terutamanya jika pengguna anda menggunakan kata laluan biasa (sekali lagi, seperti '123456'):

    <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>
    Salin selepas log masuk
    Salin selepas log masuk
    Tetapi walaupun satu kata laluan mendapat retak, itu tidak akan memberi anda kata laluan secara automatik untuk setiap pengguna yang mungkin menggunakannya, kerana tiada pengguna harus mempunyai hash yang disimpan yang sama.

    isu rawak

    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 ():

    Risiko dan cabaran hashing kata laluan

    bandingkan dengan imej output dari trng:

    Risiko dan cabaran hashing kata laluan 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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Untuk terus mengurangkan serangan kekerasan, kita dapat melaksanakan teknik peregangan kata laluan. Ini hanyalah algoritma berulang atau rekursif yang mengira nilai hash berulang kali, biasanya puluhan ribu kali (atau lebih).

    Algoritma ini harus berulang cukup untuk melakukan semua pengiraan dalam sekurang -kurangnya 1 saat (hashing yang lebih perlahan juga bermakna penyerang perlu menunggu). Risiko dan cabaran hashing kata laluan

    Untuk memecahkan kata laluan yang dijamin dengan peregangan, penyerang harus:

    1. Ketahui kiraan lelaran yang tepat, sebarang sisihan akan menghasilkan hash yang sama sekali berbeza.
    2. harus menunggu sekurang -kurangnya 1 saat antara setiap percubaan.

    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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Terdapat juga algoritma intensif masa dan memori seperti bcrypt (melalui fungsi crypt ()) dan scrypt

    <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>
    Salin selepas log masuk
    Salin selepas log masuk
    di mana kos $ adalah faktor kerja, dan $ garam adalah rentetan rawak yang anda boleh menghasilkan menggunakan fungsi Secure_rand () di atas.

    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?

    hashing dan ciphering (atau

    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: Risiko dan cabaran hashing kata laluan

    Sekarang, seseorang di Adobe memutuskan untuk memujuk kata laluan, tetapi membuat dua kesilapan besar:

    1. menggunakan kekunci cipher yang sama untuk menyulitkan kata laluan
    2. memutuskan untuk meninggalkan medan petunjuk kata laluan dalam teks biasa

    katakan contohnya, selepas menggunakan algoritma penyebaran ke medan kata laluan, kini data kami kelihatan seperti berikut:

    Risiko dan cabaran hashing kata laluan

    Walaupun kata laluan tidak dapat disahsulit, dan kita tidak dapat mengetahui kunci penyulitan yang digunakan dengan cara yang mudah, dengan memeriksa data yang kita dapati bahawa rekod 2 dan 7 berkongsi kata laluan yang sama, juga 3 dan 6 ... Di sinilah medan petunjuk kata laluan dimainkan.

    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 PrimaryKey

    Di 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:

    Risiko dan cabaran hashing kata laluan 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.

    Kesimpulan

    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.

    Soalan Lazim (Soalan Lazim) pada Hashing Kata Laluan

    Apakah perbezaan antara hashing dan penyulitan kata laluan?

    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.

    Apakah risiko menggunakan algoritma hash yang lemah? Seperti MD5 dan SHA-1, terdedah kepada serangan. Mereka telah mengetahui kelemahan dan boleh retak dengan mudah dengan kuasa pengkomputeran moden. Sebagai contoh, mereka terdedah kepada serangan perlanggaran, di mana dua input yang berbeza menghasilkan output hash yang sama. Ini menjejaskan integriti data. Oleh itu, disarankan untuk menggunakan algoritma hashing yang lebih kuat seperti SHA-256 atau BCRYPT yang memberikan tahap keselamatan yang lebih tinggi. keselamatan kata laluan yang disimpan. Ini dilakukan dengan menggunakan fungsi hash kriptografi kepada kata laluan pengguna, bersama-sama dengan garam, dan kemudian membasmi semula hasilnya berkali-kali. Proses ini meningkatkan masa yang diperlukan untuk kata laluan hash, yang dapat menghalang penyerang yang bergantung pada membuat banyak percubaan cepat untuk meneka kata laluan.

    Apakah serangan meja pelangi? Jadual pelangi mengandungi semua permutasi plaintext yang mungkin kata laluan yang disulitkan. Kaedah ini berkesan terhadap hashing asas, tetapi menambah garam yang unik untuk setiap kata laluan hash dapat menghalang serangan meja pelangi.

    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.

    Apakah kesan fungsi hash ke atas prestasi aplikasi saya? intensif dan boleh memberi kesan kepada prestasi permohonan anda. Walau bagaimanapun, kesan ini biasanya boleh diabaikan berbanding dengan faedah keselamatan. Kelewatan yang disebabkan oleh fungsi hash yang selamat sebenarnya boleh menjadi penghalang kepada penyerang, kerana ia melambatkan percubaan untuk meneka kata laluan. Untuk memastikan keselamatan kata laluan pengguna maksimum, ikuti amalan terbaik ini: Gunakan algoritma hashing yang kuat, selamat, dan terkini; Tambahkan garam yang unik untuk setiap hash kata laluan; Pertimbangkan untuk menambah lada; dan melaksanakan regangan kata laluan. Di samping itu, menguatkuasakan dasar kata laluan yang kuat untuk pengguna anda, seperti panjang minimum, dan campuran aksara, nombor, dan simbol.

Atas ialah kandungan terperinci Risiko dan cabaran hashing kata laluan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan