Cara terbaik untuk implementasi 'lupa kata sandi'? [Tutup]

154

Saya mencari metode terbaik untuk mengimplementasikan fitur "kata sandi yang hilang".

Saya keluar dengan 2 ide:

  1. Ketika pengguna mengklik kata sandi yang terlupa, pengguna harus memasukkan nama pengguna, email dan mungkin tanggal lahir atau nama belakang. Kemudian email dengan kata sandi sementara akan dikirim ke akun email pengguna. Pengguna menggunakan kata sandi sementara untuk login dan mengatur ulang kata sandinya.

  2. Mirip, tetapi email akan berisi tautan untuk membiarkan pengguna mengatur ulang kata sandinya.

Atau ada yang bisa menyarankan saya cara yang lebih baik dan aman? Saya juga berpikir untuk mengirim kata sandi atau tautan sementara, memaksa pengguna untuk mengatur ulang kata sandi dalam waktu 24 jam, atau kata sandi atau tautan sementara tidak akan dapat digunakan. Bagaimana cara melakukannya?

Zaki
sumber
Saya menandai ulang pos karena ini melampaui JSF - Anda mungkin akan mendapatkan lebih banyak respons seperti itu.
McDowell
6
@Siapa pun Ada gelombang "mari kita hapus pertanyaan tertutup ini karena XYZ" pada meta bulan ini. Saya hanya ingin mengemukakan di sana bahwa pertanyaan khusus ini tidak boleh dihapus, kecuali jika terbukti bahwa solusinya cacat dan bahwa keberadaannya lebih menyakitkan daripada membantu kasus keamanan.
Félix Gagnon-Grenier
1
OWASP "lembar contekan" untuk strategi pemulihan kata sandi yang terlupakan: owasp.org/index.php/…
daiscog
Tautan yang disarankan oleh @megaflop sekarang rusak parah, di sini ada tautan baru: cheatsheetseries.owasp.org/cheatsheets/…
Marco Bolis

Jawaban:

187

Pembaruan: direvisi pada Mei 2013 untuk pendekatan yang lebih baik

  1. Pengguna memasukkan nama pengguna dan klik "lupa kata sandi". Saya juga merekomendasikan opsi memasukkan alamat email daripada nama pengguna, karena nama pengguna kadang-kadang juga dilupakan.
  2. Sistem memiliki tabel password_change_requestsdengan kolom ID, Timedan UserID. Ketika pengguna baru menekan tombol, catatan dibuat di tabel. The Timekolom berisi waktu ketika pengguna menekan tombol "Lupa Password". The IDadalah string. Sebuah string acak panjang dibuat (katakanlah, sebuah GUID) dan kemudian di- hash seperti kata sandi (yang merupakan topik terpisah dalam dan dari dirinya sendiri). Hash ini kemudian digunakan sebagai 'ID' di tabel.
  3. Sistem mengirim email ke pengguna yang berisi tautan di dalamnya. Tautan ini juga berisi string ID asli (sebelum hashing). Link akan menjadi sesuatu seperti ini: http://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF. Halaman forgetpassword.jsp harus dapat mengambil parameter ID. Maaf, saya tidak tahu Java, jadi saya tidak bisa lebih spesifik.
  4. Ketika pengguna mengklik tautan dalam email, ia dipindahkan ke halaman Anda. Halaman mengambil IDdari URL, hash lagi, dan memeriksa tabel. Jika catatan seperti itu ada di sana dan tidak lebih dari, katakanlah, 24 jam, pengguna akan diberikan prompt untuk memasukkan kata sandi baru .
  5. Pengguna memasukkan kata sandi baru, klik OK dan semua orang hidup bahagia selamanya ... sampai waktu berikutnya!
Vilx-
sumber
1
cara yang paling tepat untuk mengimplementasikan ini adalah - mengirim token atur ulang kata sandi sementara sebagai email dalam teks biasa ke pengguna (tapi jangan pernah menyimpannya sebagai teks biasa di DB) - setelah pengguna memasukkan temp ini, segera memaksanya untuk masukkan kembali kata sandi baru. - untuk paranoid, pastikan server smtp Anda memiliki ssl, sehingga email Anda yang berisi info sensitif tidak dapat disadap. untuk sebagian besar kasus, pendekatan ini cukup aman. jika kasing Anda memerlukan pengamanan lebih lanjut, Anda mungkin seharusnya tidak memiliki pengguna yang lupa kata sandi mereka: S
Kaushik Gopal
6
Mengapa menghasilkan string acak / panduan, hash dan gunakan hash? Apakah penuntunnya tidak cukup?
Jeroen K
15
@jeroenk - Sehingga jika seseorang mencuri DB Anda, ia tidak dapat memalsukan tautan "Reset Kata Sandi" dan mengubah kata sandi seseorang.
Vilx-
4
ini pada dasarnya adalah cara yang dijelaskan untuk mereset dengan benar password crackstation.net/hashing-security.htm#faq
TruthOf42
1
@ David - Ach, saya ingin mengedit posting, tetapi topiknya terkunci. :( OK, mari kita coba lagi: meja Anda akan berisi kolom: ID, UserID, Time, TokenHash.. Anda akan menghasilkan DUA panjang, string acak Masukan string pertama ( "id") dalam IDkolom; hash yang kedua (yang "token" ) dan letakkan hash di TokenHashkolom. Menghasilkan link seperti forogotPassword.jsp?id=asdasd&token=asdasd. Token dalam link TIDAK hash. Apakah ini masuk akal sekarang?
Vilx-
28

Semuanya tergantung pada situs Anda dan tingkat keamanan yang Anda coba capai tetapi proses dasar untuk aplikasi web berjalan seperti berikut:

  1. Pengguna menavigasi ke halaman 'Lupa kata sandi saya' dan memasukkan nama pengguna atau email mereka (mana saja yang unik) untuk meminta pengaturan ulang kata sandi.

  2. Opsional pada tahap ini Anda dapat mengonfirmasi permintaan dengan meminta informasi tambahan seperti jawaban atas pertanyaan keamanan yang telah ditentukan atau tanggal lahir mereka dll. Level tambahan ini menghentikan pengguna yang menerima email yang tidak mereka minta.

  3. Cari akun pengguna. Simpan kata sandi sementara (biasanya GUID) dan cap waktu terhadap catatan akun. Kirim email ke pengguna yang berisi kata sandi sementara.

  4. Pengguna mengklik tautan yang berisi kata sandi sementara dan pengidentifikasi pengguna dalam email atau menavigasi ke halaman 'lupa kata sandi saya' dan menyalin & menempelkan kata sandi sementara dan pengidentifikasi mereka. Pengguna memasukkan kata sandi baru mereka dan mengonfirmasinya.

  5. Cari catatan pengguna dan jika waktu saat ini berada dalam batas waktu yang ditentukan (misalnya 1 jam) dari cap waktu yang disimpan di langkah 2, maka hash dan simpan kata sandi baru. (Jelas hanya jika kata sandi sementara cocok!). Hapus GUID dan cap waktu sementara.

Prinsipnya di sini adalah bahwa pengguna diemail kata sandi sementara yang memungkinkan mereka mengubah kata sandi mereka. Kata sandi yang disimpan awalnya (harus hash!) Tidak pernah diubah menjadi kata sandi sementara jika pengguna mengingatnya.

Kata sandi asli tidak akan pernah ditampilkan kepada pengguna karena harus hash dan tidak dikenal.

Perhatikan bahwa proses ini sepenuhnya bergantung pada keamanan akun email pengguna. Jadi itu tergantung pada tingkat keamanan yang ingin Anda capai. Ini biasanya cukup untuk sebagian besar situs / aplikasi.

David Glenn
sumber
24

Troy Hunt membuat beberapa poin bagus dalam artikelnya, Segala sesuatu yang Anda ingin tahu tentang membangun fitur reset kata sandi yang aman . Kutipan yang paling relevan adalah:

[T] berikut adalah dua pendekatan umum:

  1. Buat kata sandi baru di server dan kirimkan melalui email
  2. Email URL unik yang akan memfasilitasi proses reset

Meskipun banyak petunjuk yang bertentangan, poin pertama adalah benar-benar tidak di tempat yang kita inginkan. Masalah dengan melakukan ini adalah itu berarti kata sandi persisten - yang dapat Anda gunakan kembali dan gunakan kapan saja - kini telah dikirim melalui saluran yang tidak aman dan berada di kotak masuk Anda.

...

Tapi ada satu masalah besar dengan pendekatan pertama karena itu membuat penguncian berbahaya dari sebuah akun menjadi mudah. Jika saya tahu alamat email seseorang yang memiliki akun di sebuah situs web maka saya dapat menguncinya di luar kapan pun saya mau hanya dengan mengatur ulang kata sandi mereka; itu penolakan serangan layanan yang disajikan di piring perak! Inilah sebabnya mengapa reset adalah sesuatu yang seharusnya hanya terjadi setelah berhasil memverifikasi hak pemohon untuk melakukannya.

Ketika kita berbicara tentang URL penyetelan ulang, kita berbicara tentang alamat situs web yang unik untuk contoh khusus proses penyetelan ulang ini.

...

Yang ingin kami lakukan adalah membuat token unik yang dapat dikirim dalam email sebagai bagian dari URL setel kemudian dicocokkan kembali ke catatan di server bersama dengan akun pengguna sehingga mengkonfirmasi pemilik akun email memang satu-satunya yang mencoba mengatur ulang kata sandi. Sebagai contoh, token mungkin "3ce7854015cd38c862cb9e14a1ae552b" dan disimpan dalam tabel bersama ID pengguna yang melakukan reset dan waktu di mana token itu dihasilkan (lebih lanjut tentang itu pada suatu saat). Ketika email dikirim, itu berisi URL seperti "Reset /? Id = 3ce7854015cd38c862cb9e14a1ae552b" dan ketika pengguna memuat ini, halaman memeriksa keberadaan token dan akibatnya mengkonfirmasi identitas pengguna dan memungkinkan kata sandi untuk diubah.

...

Hal lain yang ingin kami lakukan dengan URL reset adalah membatasi waktu token sehingga proses reset harus diselesaikan dalam durasi tertentu, katakan dalam satu jam.

...

Akhirnya, kami ingin memastikan bahwa ini adalah proses satu kali. Setelah proses reset selesai, token harus dihapus sehingga URL reset tidak lagi berfungsi. Seperti pada poin sebelumnya, ini untuk memastikan penyerang memiliki jendela yang sangat terbatas di mana mereka dapat menyalahgunakan URL atur ulang. Plus tentu saja token tidak lagi diperlukan jika proses reset telah selesai dengan sukses.

Dia membuat banyak poin bagus tentang menghindari kebocoran informasi, CAPTCHA, otentikasi dua faktor, dan tentu saja praktik terbaik dasar seperti hashing kata sandi. Saya pikir penting untuk dicatat bahwa saya tidak setuju dengan Troy tentang kegunaan pertanyaan keamanan, lebih memilih skeptisisme Bruce Schneier terhadap praktik tersebut :

Inti dari semua pertanyaan ini adalah sama: kata sandi cadangan. Jika Anda lupa kata sandi, pertanyaan rahasia dapat memverifikasi identitas Anda sehingga Anda dapat memilih kata sandi lain atau meminta situs mengirimkan surel kata sandi Anda saat ini kepada Anda. Ini adalah ide yang bagus dari perspektif layanan pelanggan - pengguna cenderung lupa nama hewan peliharaan pertamanya daripada kata sandi acak - tetapi mengerikan untuk keamanan. Jawaban atas pertanyaan rahasia lebih mudah ditebak daripada kata sandi yang baik, dan informasinya jauh lebih umum.

Dave Liepmann
sumber
1
Tautan itu memiliki gambar NSFW yang jelas, ada tautan untuk mengubahnya, tetapi banyak orang yang memindai halaman terlebih dahulu. Ide bodoh!
nik0lai
Tautan ke artikel Troy Hunt telah berubah. Goto troyhunt.com/everything-you-ever-wanted-to-know
knarfancho
@knarfancho Tetap, terima kasih!
Dave Liepmann
15

Saya akan pergi dengan:

  1. Minta pengguna untuk email, periksa email terdaftar
  2. Hasilkan GUID, dan kirimkan ke email itu
  3. Jangan setel ulang kata sandi
  4. Tautan klik pengguna, dan kemudian harus memasukkan pass baru
  5. Setel ulang kata sandi hanya setelah pengguna ada di situs Anda, dan telah mengklik tombol setel ulang setelah mengetik pass baru.
  6. Jadikan GUID itu kedaluwarsa dalam periode waktu singkat agar lebih aman.
andres.santana
sumber
Saya tidak ingin mendapat masalah bertanya? tetapi ini terkait dengan jawaban Anda. Bagaimana Anda menghasilkan GUID?
KingAndrew
2
-1 karena tidak menerapkan semacam hash pada tautan yang Anda kirim ke orang tersebut
TruthOf42
11

Ketika Anda mengirim informasi apa pun melalui email, itu tidak akan aman. Ada terlalu banyak cara seseorang bisa mendapatkannya. Ini akan menjadi permainan anak-anak bagi peretas yang terampil yang ingin mencuri informasi Anda.

Jangan mengirim informasi pribadi seperti kata sandi dan informasi pendapatan melalui email karena itu bisa menjadi SANGAT MEMBAYARKAN untuk Anda dan organisasi Anda jika informasi tersebut bocor atau dicuri. Pikirkan keamanan dengan serius. Hanya perlu satu insiden agar semua bata jatuh.

Adapun pengambilan kata sandi, baca dengan seksama Lupa Kata Sandi Praktik Terbaik .

Intinya adalah bahwa aplikasi yang mengikuti praktik terbaik harus memungkinkan pengguna untuk mereset kata sandi sendiri. Pertanyaan keamanan pribadi harus digunakan. Aplikasi tidak boleh mengirim email, menampilkan kata sandi, atau mengatur kata sandi sementara.

SUNTING: Tautan yang diperbarui

jinsungy
sumber
Saya mencoba tautan untuk Lupa Kata Sandi Praktik Terbaik dan mendapat 500 server kesalahan. Apakah Anda pikir server sedang down sekarang atau ada tautan lain untuk diikuti?
KingAndrew
tautannya mati lagi.
Eric Cope
7

Seperti yang dikatakan, itu tergantung pada tingkat keamanan yang diperlukan, namun, jika Anda membutuhkan tingkat yang lebih tinggi, beberapa solusi baru yang saya lihat meliputi;

  • Menampilkan setengah dari kata sandi sementara ketika identitas pengguna telah dikonfirmasi (pertanyaan keamanan, alamat email dll.) Kemudian setengah lainnya dikirim ke akun email. Jika akun surel telah disusupi, kecil kemungkinan orang yang sama juga berhasil melakukan serangan tengah. (Terlihat di UK Goverment Gateway)

  • Mengonfirmasi identitas melalui email dan media lain - misalnya kode yang dikirim melalui teks ke ponsel yang terdaftar. (Terlihat di eBay / PayPal)

Karena di suatu tempat di antara dua ekstrem ini menerapkan pertanyaan keamanan mungkin cara untuk pergi sebagaimana disebutkan oleh DaveG.

Tom Werner
sumber
6

Jika Anda memasukkan alamat email dengan registrasi. Tombol "lupa kata sandi" mengirim email ke alamat email itu. Ini memastikan bahwa informasi dikirim ke email tepercaya.

(Kecuali jika basis data diretas, tetapi tidak ada yang aman).

Toon Krijthe
sumber
5

Berikut adalah tiga tautan yang sangat bagus yang memberikan informasi tentang pengaturan ulang kata sandi:

  1. http://jtauber.com/blog/2006/03/20/account_management_patterns/

  2. (Jangan biarkan pengguna mengonfirmasi menggunakan GET): http://www.artima.com/forums/flat.jsp?forum=106&thread=152805&start=15&msRange=15

  3. http://fishbowl.pastiche.org/archives/docs/PasswordRecovery.pdf

Semoga itu bisa membantu. Mereka benar-benar membantu saya memahami masalah ini.

KingAndrew
sumber
4

Saya akan memberlakukan alamat email unik di seluruh akun.

Maka itu adalah masalah sederhana mengirimkan tautan ke halaman sementara yang memungkinkan orang tersebut mengubah kata sandi mereka. (tunggu 24 jam atau kurang)

Akun email pengguna adalah tautan terlemah dalam skenario ini.

Andrew Harry
sumber
2

Jangan pernah mengirim email kata sandi kepada pengguna. Bahkan jika itu dihasilkan secara otomatis. Pendekatan terbaik (merekomendasikan dan digunakan oleh SANS dan lainnya):

  1. Pada halaman kata sandi yang terlupakan, tanyakan id email / pengguna dan kata sandi BARU dari pengguna.
  2. Kirim tautan melalui email ke email yang disimpan untuk akun itu dengan tautan aktivasi.
  3. Ketika pengguna mengklik tautan itu, aktifkan kata sandi baru.

Jika dia tidak mengklik tautan dalam 24 jam atau lebih, nonaktifkan tautannya (sehingga tidak mengubah kata sandi lagi).

Jangan pernah mengubah kata sandi tanpa persetujuan pengguna. Itu berarti jangan mengirim email kata sandi baru hanya karena seseorang mengklik tautan kata sandi yang terlupa dan mengetahui nama akunnya.

Sucuri
sumber
13
Saya khawatir dengan teknik ini. Penyerang memasuki email Anda dan kata sandi BARU. Pemilik akun menerima email, salah membaca sesuatu, dan mengklik tautan. Penyerang menunggu, mencoba kata sandi baru setiap menit, mendapatkan akses ke akun sampai pemilik akun menyadari apa yang terjadi dan akhirnya pergi ke halaman "lupa kata sandi".
Odi - Xceed
Masalah lain! memberikan kata sandi baru pada waktu reset kata sandi bukanlah pilihan yang baik. Saya mungkin lupa kata sandi baru lagi jika memeriksa email saya setelah jam!
Yazid Erman