it-swarm-id.com

Jumlah iterasi yang disarankan saat menggunakan PKBDF2-SHA256?

Saya ingin tahu apakah ada yang punya saran atau titik referensi ketika menentukan berapa banyak iterasi 'cukup baik' saat menggunakan PBKDF2 (khusus dengan SHA-256). Tentu saja, 'cukup baik' adalah subyektif dan sulit untuk didefinisikan, bervariasi berdasarkan aplikasi & profil risiko, dan apa yang 'cukup baik' hari ini kemungkinan tidak 'cukup baik' besok ...

Tetapi pertanyaannya tetap, apa yang menurut industri saat ini 'cukup baik'? Poin referensi apa yang tersedia untuk perbandingan?

Beberapa referensi yang saya temukan:

  • September 2000 - 1000+ putaran direkomendasikan (sumber: RFC 2898)
  • Feb 2005 - AES di Kerberos 5 'default' ke 4.096 putaran SHA-1. (sumber: RFC 3962)
  • September 2010 - ElcomSoft mengklaim iOS 3.x menggunakan 2.000 iterations, iOS 4.x menggunakan 10.000 iterations, menunjukkan BlackBerry menggunakan 1 (algoritma hash yang tepat tidak disebutkan) (sumber: ElcomSoft )
  • Mei 2011 - LastPass menggunakan 100.000 iterasi SHA-256 (sumber: LastPass )
  • Jun 2015 - StableBit menggunakan 200.000 iterasi SHA-512 (sumber: StableBit CloudDrive Nuts & Bolts )
  • Agt 2015 - CloudBerry menggunakan 1.000 iterasi SHA-1 (sumber: Pertimbangan Keamanan Lab CloudBerry (pdf) )

Saya menghargai referensi atau umpan balik tambahan tentang bagaimana Anda menentukan berapa banyak iterasi 'cukup baik' untuk aplikasi Anda.

Sebagai latar belakang tambahan, saya mempertimbangkan PBKDF2-SHA256 sebagai metode yang digunakan untuk hash kata sandi pengguna untuk penyimpanan untuk situs web yang sadar akan keamanan. Garam PBKDF2 yang saya rencanakan adalah: garam acak per pengguna (disimpan di tempat yang kosong dengan catatan pengguna masing-masing) XOR'ed dengan garam global. Tujuannya adalah untuk meningkatkan biaya brute forcing passwords dan untuk menghindari mengungkapkan pasangan pengguna dengan kata sandi yang identik.

Referensi:

  • RFC 2898: PKCS # 5: Spesifikasi Kriptografi Berbasis Kata Sandi v2.0
  • RFC 3962: Enkripsi Standar Lanjut (AES) Enkripsi untuk Kerberos 5
  • PBKDF2: Fungsi Penurunan Kunci Berbasis Kata Sandi v2
195
Tails

Anda harus menggunakan jumlah putaran maksimum yang dapat ditoleransi, berdasarkan kinerja, dalam aplikasi Anda. Jumlah putaran adalah faktor perlambatan, yang Anda gunakan atas dasar bahwa dalam kondisi penggunaan normal, perlambatan tersebut memiliki dampak yang dapat diabaikan bagi Anda (pengguna tidak akan melihatnya, biaya CPU tambahan tidak berarti membeli server yang lebih besar, dan sebagainya). Ini sangat tergantung pada konteks operasional: mesin apa yang terlibat, berapa banyak otentikasi pengguna per detik ... sehingga tidak ada respons satu ukuran untuk semua.

Gambaran luasnya demikian:

  • Waktu untuk memverifikasi satu kata sandi adalah v di sistem Anda. Anda dapat menyesuaikan waktu ini dengan memilih jumlah putaran di PBKDF2.
  • Seorang penyerang potensial dapat mengumpulkan f kali lebih banyak kekuatan CPU daripada Anda (misalnya Anda memiliki server tunggal, dan penyerang memiliki 100 PC besar, masing-masing menjadi dua kali lebih cepat dari server Anda: ini mengarah ke f = 200 ).
  • Rata-rata pengguna memiliki kata sandi entropi n bit (ini berarti mencoba menebak kata sandi pengguna, dengan kamus "kata sandi yang masuk akal", akan membawa rata-rata 2n-1 mencoba).
  • Penyerang akan menemukan sistem Anda layak diserang jika kata sandi rata-rata dapat dipecahkan dalam waktu kurang dari p (itulah "kesabaran" penyerang).

Tujuan Anda adalah membuat biaya rata-rata untuk memecahkan satu kata sandi melebihi kesabaran penyerang, sehingga ia bahkan tidak mencoba, dan terus berkonsentrasi pada target lain yang lebih mudah. Dengan notasi yang dirinci di atas, ini berarti Anda ingin:

v · 2n-1 > f · p

p berada di luar kendali Anda; itu dapat diperkirakan berkaitan dengan nilai dari data dan sistem yang dilindungi oleh kata sandi pengguna. Katakanlah p adalah satu bulan (jika butuh lebih dari satu bulan, penyerang tidak akan repot mencoba). Anda dapat membuat f lebih kecil dengan membeli server yang lebih besar; di sisi lain, penyerang akan mencoba untuk membuat f lebih besar dengan membeli mesin yang lebih besar. Poin yang memberatkan adalah bahwa pemecahan kata sandi adalah tugas paralel memalukan , sehingga penyerang akan mendapatkan dorongan besar dengan menggunakan GPU yang mendukung pemrograman umum ; jadi tipikal f masih akan berkisar dalam urutan beberapa ratus.

n berkaitan dengan kualitas kata sandi, yang dapat Anda pengaruhi melalui kebijakan pemilihan kata sandi yang ketat, tetapi secara realistis Anda akan kesulitan mendapatkan nilai n di luar, katakanlah, 32 bit. Jika Anda mencoba menerapkan kata sandi yang lebih kuat, pengguna akan mulai memerangi Anda secara aktif, dengan solusi seperti menggunakan kembali kata sandi dari tempat lain, menulis kata sandi pada catatan tempel, dan sebagainya.

Jadi parameter yang tersisa adalah v . Dengan f = 200 (penyerang dengan selusin GPU yang baik), kesabaran satu bulan, dan n = 32 , Anda perlu v menjadi setidaknya 241 milidetik (catatan: Saya awalnya menulis "8 milidetik" di sini, yang salah - ini adalah angka untuk kesabaran satu hari, bukan satu bulan). Jadi, Anda harus mengatur jumlah putaran di PBKDF2 sehingga menghitungnya dengan satu kata sandi setidaknya membutuhkan waktu yang banyak di server Anda. Anda masih dapat memverifikasi empat kata sandi per detik dengan satu inti, sehingga dampak CPU mungkin diabaikan (*). Sebenarnya, lebih aman menggunakan putaran lebih dari itu, karena, mari kita hadapi itu, mendapatkan entropi senilai 32 bit dari rata-rata kata sandi pengguna agak optimis; di sisi lain, tidak banyak serangan akan mencurahkan lusinan PC selama satu bulan penuh untuk tugas memecahkan satu kata sandi, jadi mungkin "kesabaran penyerang" satu hari lebih realistis, yang mengarah ke biaya verifikasi kata sandi 8 milidetik.

Jadi, Anda perlu membuat beberapa tolok ukur. Juga, hal di atas berfungsi selama implementasi PBKDF2/SHA-256 Anda cepat. Misalnya, jika Anda menggunakan implementasi berbasis C #/Java sepenuhnya, Anda akan mendapatkan faktor pelambatan 2 hingga 3 (dibandingkan dengan C atau Majelis) untuk tugas-tugas intensif CPU; dalam notasi di atas, ini setara dengan mengalikan f dengan 2 atau 3. Sebagai baseline perbandingan, CPU Core2 2,4 GHz dapat melakukan sekitar 2,3 juta perhitungan dasar SHA-256 per detik (dengan satu inti), jadi ini akan menyiratkan, pada CPU itu, sekitar 20.000 putaran untuk mencapai tujuan "8 milidetik".


(*) Berhati-hatilah bahwa membuat verifikasi kata sandi lebih mahal juga membuat server Anda lebih rentan terhadap Serangan Denial-of-Service . Anda harus menerapkan beberapa tindakan pencegahan dasar, seperti memasukkan sementara alamat IP klien yang mengirim terlalu banyak permintaan per detik. Anda harus tetap melakukannya, untuk menggagalkan serangan kamus online .

230
Thomas Pornin

Lari openssl speed pada baris perintah untuk mendapatkan gambaran tentang seberapa cepat fungsi intisari pesan. Saya dapat menghitung sekitar 1,6 juta sha256 hash per detik atau sekitar 145 Miliar tebakan per hari pada quad core 2.2ghz Sandy Bridge. Jika seseorang memiliki kata sandi yang ada dalam kamus bahasa Inggris dan menggunakan satu putaran sha256 maka akan butuh waktu lebih lama untuk memuat daftar Word dari disk daripada mengulangi daftar untuk memecahkan hash. Jika Anda melakukan PKBDF2-SHA256 dengan beberapa ratus ribu putaran, dibutuhkan beberapa menit untuk istirahat. Menegakkan kebijakan kata sandi yang kuat membantu, banyak.

Jawaban sebenarnya: Berapa banyak waktu yang Anda miliki untuk membakar?

32
rook

Jawaban Thomas memberikan model dan data dasar yang bermanfaat. Tetapi tujuan yang dia sampaikan tidak masuk akal bagi saya. Seorang penyerang biasa tidak akan tahu jumlah iterasi Anda sampai setelah benar-benar meretas situs dan mengambil basis data hash. Setelah melakukan itu, mereka tidak akan melanjutkan hanya karena Anda menggunakan jumlah iterasi yang besar. Mereka akan mencoba untuk memecahkan sebanyak yang mereka bisa, dan sangat mungkin mempublikasikan hash sehingga orang lain akan terus mencoba memecahkannya selama bertahun-tahun yang akan datang dengan perangkat keras yang semakin kuat. Jadi "p" dan "f" akan terus meningkat lama setelah retasan.

Juga, kata sandi pengguna nyata tidak dimodelkan dengan baik oleh ukuran kompleksitas seperti 32 bit entropi. Artikel Keamanan Dapat Digunakan Kembali: Makalah Baru tentang Metrik Keamanan Kata Sandi sangat membantu dalam hal ini, dan mendokumentasikan apa yang telah lama kita ketahui: banyak pengguna memilih kata sandi yang mudah ditebak, dan ada buntut panjang. Ini juga berarti penyerang akan selalu menemukan beberapa jika mereka berusaha cukup keras.

Saya akan mengatakan bahwa tujuan yang lebih mungkin adalah untuk melindungi persentase pengguna Anda sebanyak mungkin dari kata sandi yang dibobol. Misalnya. tabel 4.2.1 dari PDF menunjukkan bahwa jika Anda berhasil membatasi penyerang selama beberapa kampanye serangan, dari rata-rata 1 juta upaya per hash hingga 500.000 upaya , Anda mungkin melindungi kata sandi dari 5% pengguna Anda (dengan anggapan campuran dengan lebih banyak kata sandi 7-karakter dari 8+ kata sandi karakter, sehingga mengurangi persentase retak dari 35% menjadi 30%). Tentu saja bentuk kurva yang tepat dan di mana mereka berada akan sangat bervariasi.

Jadi saya hanya akan menghitung iterasi maksimum yang bisa Anda anggarkan, asalkan tidak menunda pengguna nyata yang melakukan login normal. Dan Anda harus meningkatkan nilainya ketika kapasitas komputasi Anda tumbuh dari tahun ke tahun.

17
nealmcb

Mesin modern yang dilengkapi dengan 8 GPU generasi saat ini akan menghitung pada urutan 9 miliar hash SHA-256 per detik, atau sekitar 777 Triliun hash per hari, dan GPU itu dapat melakukan serangan kamus berdasarkan aturan.

0
ModernMachine

Anggap ini sebagai komentar yang sangat panjang. Saya ingin tahu seberapa cepat hal-hal berjalan pada laptop pribadi saya (Thinkpad T460p, Intel i7-6700HQ ). Saya tahu bahwa untuk memecahkan kata sandi asin ada perangkat khusus, tetapi jika Anda memiliki layanan web, Anda mungkin tidak memiliki perangkat keras khusus untuk itu.

Hasil evaluasi

Default werkzeug.security.generate_password_hash saat ini (2019-06-01) adalah pbkdf2:sha256:150000.

Seperti yang Anda lihat, waktu eksekusi tumbuh secara linier dengan jumlah putaran/iterasi. Ini berarti defaultnya kira-kira membutuhkan 281ms pada mesin saya.

enter image description here

enter image description here

sha512,     1 iteration : min:   67.1μs, mean:    72.2μs, max:   310.9μs
sha512, 15000 iteration: min: 38462.8μs, mean: 40291.2μs, max: 44842.4μs
sha256, 15000 iteration: min: 27167.6μs, mean: 28118.0μs, max: 30826.0μs
sha512,  1000 iteration: min:  2636.7μs, mean:  2694.3μs, max:  3579.0μs
sha256,  1000 iteration: min:  1870.7μs, mean:  1888.8μs, max:  2477.0μs
md5,    15000 iteration: min: 21126.2μs, mean: 21864.8μs, max: 23799.3μs
sha512,     1 iteration : min:   23.4μs, mean:    26.9μs, max:    40.6μs
sha512,  1000 iteration: min:  2586.7μs, mean:  2761.1μs, max:  3120.6μs
sha256,  1000 iteration: min:  1823.3μs, mean:  1834.6μs, max:  2008.5μs
sha512, 15000 iteration: min: 38507.9μs, mean: 40210.8μs, max: 47430.3μs
sha256, 15000 iteration: min: 27257.1μs, mean: 28454.0μs, max: 31213.5μs
md5,    15000 iteration: min: 21219.9μs, mean: 21842.4μs, max: 24305.0μs

Kode

0
Martin Thoma