it-swarm-id.com

Bagaimana suatu sistem dapat memberlakukan jumlah minimum dari perubahan karakter dalam kata sandi, tanpa menyimpan atau memproses kata sandi lama dalam cleartext?

Di beberapa lingkungan, pengguna diharuskan mengubah sejumlah karakter tertentu setiap kali mereka membuat kata sandi baru. Hal ini tentu saja untuk mencegah kata sandi mudah ditebak, terutama dengan pengetahuan tentang kata sandi lama seperti karyawan yang berangkat mungkin memiliki akun layanan bersama.

Saya memiliki terpisahpertanyaan terbuka untuk membahas sisi yang mendorong tombol dari penegakan ini. Namun, saya juga ingin tahu bagaimana penegakan ini bekerja di bagian belakang. Jika kata sandi cleartext tidak dapat diturunkan dari algoritma hashing yang kuat, bagaimana sistem menentukan berapa banyak karakter yang telah diubah dalam kata sandi baru?

52
Iszi

Saya tidak yakin tentang membandingkan dengan semua kata sandi yang telah digunakan pengguna sebelumnya, karena itu benar-benar tergantung pada sistem hashing yang Anda gunakan dan saya akan mengatakan jika mungkin untuk mendapatkan kesamaan dari hash maka itu bukan sistem yang sangat baik untuk memulai dengan.

Tetapi dengan asumsi bahwa pengguna harus menyediakan kata sandi mereka saat ini ketika mengatur kata sandi baru mereka, Anda setidaknya bisa memeriksa yang baru terhadap yang sekarang karena Anda akan sama-sama tidak terluka pada saat itu.

The pam_cracklib modul di Linux memeriksa kata sandi seperti ini dan melakukan beberapa pemeriksaan dasar secara default.

  • Apakah kata sandi baru hanyalah kata sandi lama dengan huruf terbalik ("kata sandi" vs. "drowssap") atau diputar ("kata sandi" vs. "asswordp")?
  • Apakah kata sandi baru hanya berbeda dari yang lama karena perubahan huruf besar ("kata sandi" vs "Kata sandi")?
  • Apakah setidaknya beberapa karakter minimum dalam kata sandi baru tidak ada dalam kata sandi lama? Di sinilah parameter "difok" berperan.

Anda dapat menemukan lebih banyak detail tentangnya di sini .

47
Mark Davidson

Ini mudah dilakukan pada perubahan kata sandi (di mana pengguna berada dan harus diminta untuk memberikan kata sandi lama dan baru).

27
frankodwyer

Biasanya, ketika Anda mengubah kata sandi, Anda harus memasukkan kata sandi lama terlebih dahulu. Ini berguna untuk keamanan, untuk memastikan bahwa seseorang yang berjalan dengan komputer Anda tidak dapat dengan cepat mengubah kata sandi dan mengunci Anda saat punggung Anda dihidupkan. Ini juga memungkinkan server untuk menegakkan aturan jarak kata sandi. Server hanya perlu menyimpan kata sandi lama di memori selama diperlukan untuk memverifikasi bahwa kata sandi baru cukup berbeda dari yang lama. Tidak perlu menyimpan kata sandi yang tidak rusak.

Omong-omong, aturan mengubah kata sandi semacam itu buruk untuk keamanan. (Ya, saya tahu Anda adalah korban di sini.) Jika pengguna harus sering mengganti kata sandi, mereka akan memilih kata sandi yang sangat mudah diingat, atau menuliskannya di tempat yang mudah diakses. Ada sedikit keuntungan dalam kedaluwarsa kata sandi, dan hilangnya kekuatan kata sandi yang diharapkan dari membuat pengguna mengubah kata sandi mereka setiap beberapa bulan lebih dari mengimbangi keuntungan itu. Untuk perlakuan yang lebih mendalam tentang kedaluwarsa kata sandi, lihat Bagaimana cara mengubah kata sandi Anda setiap 90 hari meningkatkan keamanan? dan Apakah memaksa pengguna untuk mengubah kata sandi bermanfaat? dan Memerlukan perubahan kata sandi reguler tetapi menyimpan kata sandi sebelumnya?

Pengguna harus memasukkan kata sandi lama dan baru untuk perubahan kata sandi. Jadi membandingkan kata sandi baru dengan kata sandi lama dapat dengan mudah dilakukan karena versi plaintext diberikan oleh pengguna.

Untuk membandingkan kata sandi baru dengan kata sandi sebelumnya (selain kata sandi saat ini), pemeriksaan hanya dapat dilakukan dengan membandingkan hasil hash. Metode apa pun yang memungkinkan perbandingan lainnya akan menjadi lubang keamanan.

5
Jacco

Biasanya, ketika Anda mengubah kata sandi, Anda harus memasukkan kata sandi lama terlebih dahulu. Ini berguna untuk keamanan, untuk memastikan bahwa seseorang yang berjalan dengan komputer Anda tidak dapat dengan cepat mengubah kata sandi dan mengunci Anda saat punggung Anda dihidupkan. Ini juga memungkinkan server untuk menegakkan aturan jarak kata sandi. Server hanya perlu menyimpan kata sandi lama di memori selama diperlukan untuk memverifikasi bahwa kata sandi baru cukup berbeda dari yang lama. Ia tidak perlu menyimpan kata sandi yang tidak diacuhkan, dan dapat menghapus hash lama begitu ia menyimpan yang baru.

Jika server memeriksa kesetaraan dengan kata sandi yang lebih lama, bukan hanya yang terakhir, itu cerita yang berbeda. Cukup mudah untuk memeriksa penggunaan kembali kata sandi dengan hash lama: untuk setiap hash lama, hitung hash kata sandi baru dengan garam lama dan bandingkan dengan nilai hash lama. Pada sistem yang dikonfigurasikan dengan benar, ini membutuhkan waktu beberapa detik.

Ini masalah yang berbeda jika server memeriksa kesamaan dengan kata sandi yang lebih lama, dan bukan hanya persamaan dengan kata sandi yang lebih lama ditambah kesamaan dengan yang sebelumnya. Jika server menggunakan hash yang tepat, maka ia harus mencoba variasi pada kata sandi baru dan hash setiap variasi dengan semua garam lama. Itu bisa memakan waktu beberapa menit atau lebih dengan jumlah variasi yang tidak dapat diabaikan. Jadi jika server mengeluh tentang kemiripan dengan kata sandi yang lebih lama, saya akan khawatir bahwa mereka mungkin menyimpan kata sandi yang tidak di hash dengan benar.

Ada pendekatan lain untuk kemiripan, yaitu untuk menyimpan hash dari setiap variasi kata sandi, masing-masing diasinkan secara independen, segera setelah kata sandi ditetapkan. Tapi itu tidak banyak membantu Anda: server masih perlu menghitung hash kata sandi baru dengan semua garam ini, yang masih membutuhkan waktu lama, terlalu lama untuk perubahan kata sandi yang khas.

Cara untuk memulihkan kata sandi lama yang benar-benar berfungsi, tetapi yang belum pernah saya lihat diimplementasikan di mana pun, adalah melakukan hal berikut pada perubahan kata sandi, setelah meminta pengguna untuk kata sandi lama dan sebelum menghapus kata sandi lama dari memori:

  • Turunkan kunci simetris dari kata sandi baru (menggunakan algoritma penguatan kunci).
  • Turunkan kunci dari kata sandi lama dengan cara yang sama.
  • Dekripsi daftar kata sandi lama dengan kunci lama.
  • Tambahkan kata sandi sebelumnya ke daftar.
  • Lakukan pemeriksaan kebijakan - semua kata sandi sebelumnya diketahui pada saat ini. Jika kata sandi baru melewati pemeriksaan ...
  • Enkripsi daftar kata sandi lama dengan kunci baru.
  • Ubah kata sandi dan daftar terenkripsi dari kata sandi sebelumnya, basis data.

Ini agak berisiko karena jika kata sandi saat ini dikompromikan, semua kata sandi sebelumnya juga diekspos. Tapi itu memungkinkan untuk menerapkan kebijakan jarak kata sandi ke sejumlah kata sandi sebelumnya dengan upaya perhitungan yang masuk akal.

Ini dapat dilakukan hanya dengan menjaga hash, bahkan bisa dilakukan melalui beberapa iterasi.

Metode tersebut adalah dengan mengambil kata sandi dan mengulanginya melalui hashing algo dan memeriksa perbandingan terhadap nilai yang disimpan.

Sebagai contoh, sebagian besar pengguna (dan orang-orang di meja layanan senang untuk mundur dalam hal ini sebagai upaya terakhir dengan tipe pemarah-penting) akan mengulangi kata sandi mereka dengan sangat sederhana.

Jadi mengambil kata sandi: # foob @ r1 dan membuatnya # foob @ r2 yang mungkin Anda lihat dapat diuji tanpa sepengetahuan # foob @ r1 dengan melakukan brute force pada algo dengan cepat. Dengan kekuatan pemrosesan modern Anda dapat beralih melalui 4 karakter pertama dalam waktu kurang dari sepuluh detik.

Meskipun demi efisiensi, empat terakhir biasanya yang diubah orang sehingga Anda mungkin akan melihat keuntungan yang lebih besar di sana. Jika Anda akan melakukan non-berurutan dan berurutan, Anda sedang menunggu cukup lama untuk pengguna akhir dan sejumlah besar prosesor.

5
Ori