Terdapat salah faham biasa bahawa hash dan encryption adalah perkara yang sama. Mereka tidak. Hash tidak boleh dipulihkan. Ambil contoh berikut:
$ echo-n Password123 | md5sum
42f749ade7f9e195bf475f37a44cafcb-
Kami lulus rentetan "Password123" kepada algoritma MD5 (algo), yang melakukan operasi matematik dan mengembalikan hash pengekodan heksadesimal yang dihasilkan. Satu-satunya cara untuk mendapatkan nilai output hash yang sama adalah dengan memasukkan algo secara mentah. Ada konflik tapi kita boleh bincang nanti.
Output bagi kebanyakan algoritma hash ialah rentetan binari panjang tetap yang dikodkan heksadesimal. Yang lain, seperti contoh ini, menggunakan rentetan yang dikodkan base64 sebagai output. Sila ambil perhatian bahawa panjangnya sentiasa sama:
{SHA} uNF8eZRJ8jmr8WTjyocRJPVpe7w =
{SHA} lqdu/Zr6o2dgIER8Up1/7lcUtgw =
{SHA} qYUOwLMlDEuukA5HCT4LR1kQzco =
{SHA} MXZBCpyWJ7TTs1w2kgGJslwNwTg =
{SHA} 2sAPLaUh9Mz0bI + XxKEg7qyABe8=
TL; Dr
Saya tidak mahu bercakap terlalu banyak tentang penyulitan (kerana perkara-perkara itu untuk buku), tetapi penting untuk dapat membezakan antara rentetan hash dan rentetan yang disulitkan. Penyulitan biasanya mengisi rentetan untuk memenuhi panjang tertentu sebelum penyulitan berlaku. Ia juga memerlukan kunci (atau kata laluan) untuk menyahsulitkannya. Jika kata laluan yang disulitkan digunakan, rentetan akan berubah bergantung pada panjang input. Sekiranya anda melihat sekumpulan kata laluan ciphertext, panjang yang berbeza-beza, anda mungkin berurusan dengan penyulitan dan bukannya hash. Contoh AES-256-CBC Rentetan penyulitan dan teks biasa yang berkaitan (kunci ialah "ASDF"):
foobar | U2FsdGVkX19G + KtytNHdj6yH2AVvX26pEmtunS/PRnU = foobarfoobar | U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog = foobarfoobarfoobar | U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX ldatuqv2xexeaeoww0xg/EXJUe9aSUz $ kucing kata laluan_disulitkan U2FsdGVkX19G KtytNHdj6yH2AVvX26pEmtunS/PRnU = U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog = U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz $ untuk i dalam `cat encrypted_passwords`; do echo $i | openssl enc -base64 -d -aes-256-cbc -pas lalu:asdf; gema; Selesai foobar foobarfoobar foobarfoobarfoobar
Sekarang anda mungkin berfikir: anda mungkin betul. Walau bagaimanapun, bahan kritikal mesti tersedia untuk akses sistem bermakna pada dasarnya kata laluan utama teks biasa terletak di suatu tempat-sama ada sebagai kunci RSA atau kata laluan atau fail, tertanam dalam pangkalan data, dikodkan keras dalam aplikasi, atau kata laluan di suatu tempat dalam memori. pfft, tiada siapa yang akan menggunakan asdf sebagai kunci untuk menyulitkan kata laluan pengguna mereka '
Gunakan rentetan yang sama untuk MD5:
foobar | 3858f62230ac3c915f300c664312c63f foobarfoobar | 59faa421729e846dd800dce59943bfc0 foobarfoobarfoobar | 1352aadab322d1a033c27964be0965db
Kata laluan hash jauh dari sempurna, sebenarnya ia agak teruk, tetapi ia lebih teruk daripada penyulitan kerana apa yang cuba dicapai. Pengguna memilih keperluan minimum mutlak lebih kerap daripada tidak, dan mereka juga boleh menggunakannya di beberapa tapak. Banyak "penggodaman" sebenarnya tidak lebih daripada serangan penggunaan semula kelayakan. Sekiranya kompromi awal adalah untuk menggunakan penyulitan, satu-satunya usaha yang perlu dilakukan oleh penyerang adalah untuk mencari kunci yang menyahsulitkan semua kata laluan. Untuk hash, mereka sekurang-kurangnya perlu berusaha untuk memecahkannya. Apabila digunakan dengan algoritma moden seperti sha512crypt, bcrypt, scrypt, atau argon2, nilai hash mungkin memerlukan usaha yang besar untuk dipecahkan.
Menambah garam ialah menambah rentetan pada kata laluan sebelum hash. Garam untuk setiap hash hendaklah unik dan biasanya dipilih secara rawak, kerana maksudnya adalah untuk membuat nilai hash "kata laluan" teks biasa yang sama mempunyai nilai yang berbeza setiap kali. Ini menyukarkan kehidupan seorang pemecah kata laluan kerana untuk menyemak perkataan "kata laluan" bagi setiap pengguna daripada 1,000 pengguna, setiap pengguna mempunyai SALT yang unik dan mereka terpaksa melakukan kerja 1,000 kali-sekali bagi setiap pengguna/SALT. Ini juga bermakna mereka tidak boleh menggunakan kamus pra-kompilasi atau jadual pelangi dengan berkesan (biasanya...) kerana mereka memerlukan setiap garam tersuai.
Laman web kadang-kadang mengacaukan ini dan menggunakan garam universal untuk semua pengguna; Ini bertentangan dengan tujuan.
Berikut ialah hash SHA1 dengan garam:
b353977827f67a4ae0318f3a9447fae1c13d9d90:b8d18ca |___________________________________________| hash | garam | Pemisah
Teks jelas bagi hash ini ialah "kata laluan". Ia mempunyai nilai garam "b8d18ca" dan digunakan dalam API SHA1 ($salt.$pass). Ini bermakna algoritma mengambil teks biasa kata laluan, menjana garam, dan menambahkannya di hadapan teks biasa. Apabila tapak web atau aplikasi cuba mengesahkan kata laluan anda pada masa hadapan, ia akan mengambil kata laluan teks jelas anda sebagai input, membaca nilai salt dalam Hash yang disimpan, menambahkannya di hadapan kata laluan yang anda pilih, dan membandingkan Hash yang dihasilkan dengan Hash yang disimpan. Jika anda tidak tahu bahawa sebahagian daripadanya adalah garam, hash akan menghasilkan teks biasa berikut:
b8d18capassword
Memandangkan algoritma membuat input teks biasa, garam dan hash yang dijana Nilai boleh kekal telus kepada pengguna. Apabila memecah, jika algoritma adalah garam, kita perlu mengetahui garam supaya kita boleh membekalkannya apabila menjana plaintext calon.
Garam boleh menjadikan keretakan lebih memakan masa jika dilaksanakan dengan betul. Dengan garam rawak, anda memaksa Cracker untuk membuang masa cuba memecahkan hash yang tidak sepadan dengan garam. Ini kira-kira menyelesaikan usaha yang diperlukan untuk device_speed/number_of_salts, kerana kita perlu menjana calon untuk setiap garam. Jika garam adalah statik, maka operasi matematik adalah sama... speed_of_device/1. Cara lain untuk melihat ini:
kami GTX 980 cracks SHA1 ($salt.$pass) pada 3576.8 MH/s atau 3.5 bilion calon setiap saat hashlist kami mengandungi 1000 unik garam 3,500,000,000 / 1000 = 3,500,000 calon setiap kedua
Ini adalah tiga susunan magnitud yang lebih perlahan dan kehilangan 99.9%. Apabila menggunakan garam statik, ia kelihatan seperti ini:
kami GTX 980 retak SHA1 ($salt.$pass) pada 3576.8 MH/s atau 3.5 bilion calon setiap saat hashlist kami mengandungi 1 unik garam 3,500,000,000 / 1 = 3,500,000,000 calon setiap kedua
Jika ini tidak masuk akal, teruskan membaca, kami akan mempunyai carta yang cantik kemudian...
Satu lagi penambahbaikan biasa berbanding dengan hanya "hash this plaintext" ialah, "hash this plaintext, then hash that result, then hash that result" diulang beribu-ribu kali. Ini membolehkan satu kata laluan calon dicuba apabila pemecah kata laluan perlu melakukan beribu-ribu kali. Ini dipanggil lelaran, gelung atau kos berubah-ubah. Sesetengah algoritma cincang kata laluan menggunakan pusingan lelaran yang dikodkan keras; Lain-lain Git. menjadikannya boleh dikonfigurasikan dalam sebahagian daripada Hash itu sendiri. Sebagai contoh, md5crypt () menggunakan MD5, termasuk garam, dan gelung tepat 1000 kali. sha512crypt () menggunakan sha512, termasuk garam, dan gelung untuk bilangan yang boleh dikonfigurasikan (lalai ialah 5,000).
Lelaran terutamanya mempengaruhi kos kitaran pengiraan algoritma hash, bukan penggunaan memori atau faktor lain. Ini juga serangan penting apabila mereka bentuk yang dioptimumkan untuk menahan beberapa jenis hash, tetapi ini terlalu rumpai untuk dibincangkan di sini.
Mari kita lihat beberapa contoh untuk menunjukkan kesan pemilihan algoritma hash, sama ada garam, menggunakan berbilang lelaran dan sebagainya. Katakan penyerang mengumpul hash 1,000 pengguna dari laman web yang dijangkiti, dan mereka hanya mahu melakukan serangan mudah yang menguji hash kata laluan setiap-143 juta kata laluan calon.
Jenis hash yang digunakan oleh laman web yang dijangkiti akan memberi kesan yang besar terhadap masa yang diperlukan oleh penyerang untuk melepasi serangan ini. Ini adalah carta (relatif, kira-kira) berapa banyak saat yang diperlukan untuk menyelesaikan serangan ini, bergantung pada jenis hash yang digunakan, di mana kad grafik standard:
Nah, itu tidak berguna! Jenis hash yang paling kuat jauh lebih perlahan, tetapi jenis yang lebih pantas hanya dihancurkan sehingga tiada apa-apa. Mari kita cuba lagi skala data yang sama menggunakan masa paksi X logaritma. Apabila bar bergerak dari kiri ke kanan, mereka akan meningkat kepada kuasa 10:
Jadi beberapa perkara penting ialah: Apabila anda ingin memecahkan beberapa hash kata laluan, satu pusingan lebih mudah daripada berbilang pusingan dan tanpa garam daripada menambah garam. Sebaliknya, apabila syarikat atau laman web tertentu mengumumkan pelanggaran data yang mengandungi data pengguna, a) kata laluan sebaiknya telah dihash, bukan hanya teks biasa; b) Mereka lebih baik dimasinkan, bukan hanya dihash; c) Lebih baik mereka mempunyai hash garam berbilang pusingan yang kuat yang digunakan sepanjang masa, bukan hanya satu pusingan.
Sebelum cuba memecahkan hash kata laluan yang diberikan, terpulang kepada pemecah untuk mengetahui algoritma hash mana yang digunakan untuk melaksanakannya. Mengenal pasti jenis hash biasanya mudah, tetapi tidak selalu. Keropok biasanya membuat tekaan berasas berdasarkan petunjuk seperti panjang dan format hash. Akhirnya, satu-satunya cara untuk yakin bahawa tekaan jenis hash adalah betul ialah sama ada hash telah dipecahkan.
Terdapat beberapa sumber yang sangat baik untuk tugas ini di sini dan di sini, dan kedua-duanya menunjukkan bagaimana hash biasa kelihatan.
Pakej "hash-identifier" (boleh didapati di sini) disediakan dalam Kali Linux untuk membantu mengenal pasti jenis hash yang tidak diketahui.
Perlanggaran berlaku apabila dua input berbeza menghasilkan output hash yang sama. teruk (terang-terangan). Untuk kata laluan, ini mungkin bermakna saya mungkin tidak memecahkan kata laluan sebenar anda, tetapi kerana saya menemui input yang menghasilkan nilai hash yang sama, saya boleh menggunakan nilai teks biasa untuk menipu sistem supaya ia berfikir bahawa kata laluan itu sah. Microsoft Office menggunakan algoritma dalam perlindungan dokumennya yang terdedah kepada konflik selama bertahun-tahun. Bukan perkara biasa untuk menemui berbilang konflik untuk satu hash, yang semuanya membuka kunci dokumen.
Sebaik sahaja konflik ditemui, algoritma sebenarnya akan rosak. Jika ia berlaku sekali, secara statistik ia berkemungkinan besar akan berlaku lagi. Satu-satunya perkara yang menghalang kita ialah masa dan keupayaan pemprosesan. Apabila algoritma menjadi lebih teguh, menjana algoritma calon dan membandingkan output cincang untuk mencarinya memerlukan lebih banyak keupayaan dan masa. Akibatnya, pereka bentuk semakin pandai mencipta algoritma yang kurang terdedah kepada konflik.