Kesimpulan: SHA-1 aman seperti apa pun terhadap serangan preimage, namun mudah untuk dihitung, yang berarti lebih mudah untuk memasang serangan bruteforce atau kamus. (Hal yang sama berlaku untuk penerus seperti SHA-256.) Tergantung pada keadaan, fungsi hash yang dirancang untuk menjadi mahal secara komputasi (seperti bcrypt) mungkin merupakan pilihan yang lebih baik.
Beberapa orang sering berkomentar seperti "SHA-1 sudah rusak", jadi saya mencoba memahami apa artinya itu. Mari kita asumsikan saya memiliki basis data hash kata sandi SHA-1, dan seorang penyerang dengan algoritma pemecahan SHA-1 yang canggih dan botnet dengan 100.000 mesin dapat mengaksesnya. (Memiliki kendali atas 100k komputer rumah berarti mereka dapat melakukan sekitar 10 ^ 15 operasi per detik.) Berapa banyak waktu yang mereka perlukan untuk
- mencari tahu kata sandi salah satu pengguna?
- cari tahu kata sandi pengguna yang diberikan?
- cari tahu kata sandi semua pengguna?
- menemukan cara untuk masuk sebagai salah satu pengguna?
- menemukan cara untuk masuk sebagai pengguna tertentu?
Bagaimana itu berubah jika kata sandi diasinkan? Apakah metode salting (prefix, postfix, keduanya, atau sesuatu yang lebih rumit seperti xor-ing) penting?
Inilah pemahaman saya saat ini, setelah beberapa googling. Harap perbaiki dalam jawaban jika saya salah mengerti sesuatu.
- Jika tidak ada garam, serangan pelangi akan segera menemukan semua kata sandi (kecuali yang sangat panjang).
- Jika ada garam acak yang cukup panjang, cara paling efektif untuk mengetahui kata sandi adalah serangan brute force atau kamus. Baik serangan tabrakan maupun preimage tidak membantu menemukan kata sandi yang sebenarnya, jadi serangan kriptografis terhadap SHA-1 tidak membantu di sini. Bahkan tidak masalah apa algoritma yang digunakan - seseorang bahkan bisa menggunakan MD5 atau MD4 dan kata sandi akan sama amannya (ada sedikit perbedaan karena menghitung hash SHA-1 lebih lambat).
- Untuk mengevaluasi seberapa aman "sama amannya", mari kita asumsikan bahwa menjalankan tunggal sha1 membutuhkan 1000 operasi dan kata sandi berisi huruf besar, huruf kecil dan angka (yaitu, 60 karakter). Itu berarti penyerang dapat menguji 10 15 * 60 * 60 * 24/1000 ~ = 10 17 kata sandi potensial sehari. Untuk serangan brute force, itu berarti menguji semua kata sandi hingga 9 karakter dalam 3 jam, hingga 10 karakter dalam seminggu, hingga 11 karakter dalam setahun. (Dibutuhkan 60 kali lebih banyak untuk setiap karakter tambahan.) Serangan kamus jauh, jauh lebih cepat (bahkan penyerang dengan komputer tunggal dapat melakukannya dalam hitungan jam), tetapi hanya menemukan kata sandi yang lemah.
- Untuk masuk sebagai pengguna, penyerang tidak perlu mencari tahu kata sandi yang tepat; itu cukup untuk menemukan string yang menghasilkan hash yang sama. Ini disebut serangan preimage pertama. Sejauh yang saya bisa temukan, tidak ada serangan preimage terhadap SHA-1. (Serangan bruteforce akan membutuhkan 2 160 operasi, yang berarti penyerang teoretis kita akan memerlukan 10 30 tahun untuk menariknya. Batas kemungkinan teoretis sekitar 260 operasi, di mana serangan itu akan memakan waktu beberapa tahun.) Ada serangan preimage terhadap versi SHA-1 yang berkurang dengan efek yang dapat diabaikan (untuk SHA-1 yang berkurang yang menggunakan 44 langkah alih-alih 80, waktu serangan turun dari 2 160 operasi menjadi 2 157). Ada serangan tabrakan terhadap SHA-1 yang berada dalam kemungkinan teoritis ( yang terbaik yang saya temukan membawa waktu dari 2 80 ke 2 52 ), tetapi itu tidak berguna terhadap hash kata sandi, bahkan tanpa salting.
Singkatnya, menyimpan kata sandi dengan SHA-1 tampaknya sangat aman. Apakah saya melewatkan sesuatu?
Update: Marcelo menunjukkan sebuah artikel yang menyebutkan serangan preimage kedua di 2 106 operasi . ( Sunting: Seperti dijelaskan Thomas , serangan ini adalah konstruksi hipotetis yang tidak berlaku untuk skenario kehidupan nyata.) Saya masih tidak melihat bagaimana ini mengeja bahaya untuk penggunaan SHA-1 sebagai fungsi derivasi kunci, meskipun. Adakah umumnya alasan yang bagus untuk berpikir bahwa serangan tabrakan atau serangan preimage kedua pada akhirnya dapat berubah menjadi serangan preimage pertama?