Cara aman menerapkan login otomatis


15

Saya telah membaca banyak, banyak, banyak posting tentang bagaimana "Anda mungkin salah menyimpan kata sandi". Mereka selalu mengacu pada penyimpanan kata sandi di server tempat pengguna masuk; mereka pada dasarnya mengulangi (pun intended) saran di mana-mana seperti pastikan untuk garam password, dll. Namun, saya belum pernah melihat artikel tentang praktik terbaik untuk menyimpan kata sandi pada klien sehingga klien tidak harus login secara manual setiap kali mereka ingin masuk; fitur "ingat saya".

Banyak perangkat lunak memiliki fitur ini, dari browser hingga program seperti Dropbox.

Saya memang membaca artikel lama baru-baru ini tentang bagaimana Dropbox menyimpan ID di komputer Anda yang bisa Anda salin / tempel ke komputer lain dan mulai Dropbox dan masuk sebagai perangkat tempat Anda mendapatkan ID; tidak ada login, tidak ada apa-apa, dan akses penuh ke akun Dropbox. Ini sepertinya desain yang benar-benar bodoh, tetapi saya tidak bisa memikirkan cara yang lebih baik untuk melakukannya.

Saya bahkan tidak yakin bagaimana cara menghindari menyimpan sesuatu seperti cookie dalam teks biasa. Jika Anda mengenkripsi, di mana Anda menyimpan kunci untuk mendekripsi?

Satu-satunya cara saya melihat untuk tidak memperkenalkan kerentanan keamanan adalah dengan menghapus fitur autologin dan membuat pengguna mengetikkan kata sandi mereka setiap kali mereka ingin menggunakan layanan, tetapi itu adalah perjuangan kegunaan dan pengguna dimanjakan untuk berharap tidak harus melakukan itu.

Apa yang dapat saya baca tentang menyimpan kredensial secara lokal untuk menerapkan fitur login otomatis? Jika prinsipnya terlalu sederhana untuk keseluruhan artikel, apa itu? Perangkat lunak yang dimaksud seharusnya tidak tergantung pada fitur yang tidak ada pada semua platform (seperti "gantungan kunci" yang dimiliki beberapa distribusi linux).


2
Ini tentang apa yang Anda percayai. Jika Anda tidak percaya mesin menyimpan ID maka itu adalah masalah Anda. Jika Anda mempercayai gantungan kunci maka itu adalah keamanan maksimum yang akan Anda dapatkan. Tentu saja Anda dapat menambahkan beberapa keamanan khusus seperti mendeteksi perangkat keras atau sesuatu tetapi semuanya palsu sehingga Anda tidak bisa tahu pada akhirnya. Itu di luar kendali Anda. Tentu saja hal-hal bodoh seperti menyimpan kata sandi teks yang jelas dikecualikan.
Luc Franken

@LucFranken bagaimana Anda bisa mempercayai mesin? Seseorang dapat mengeksploitasi Anda seperti yang mereka lakukan dropbox. Saya juga akan mempercayai gantungan kunci tetapi tidak semua komputer memilikinya, dan Windows tidak pernah melakukannya (AFAIK). Dan jika Anda menyimpan kata sandi, bagaimana Anda menghindari menyimpannya dalam teks yang jelas? Jika Anda mengenkripsi mereka maka di mana Anda menyimpan kunci untuk mendekripsi itu?
Jay Simon

Itulah masalahnya, Anda tidak bisa mempercayainya. Pengguna hanya dapat mendefinisikan untuk mempercayainya. Itu mempertimbangkan pengguna memahami seberapa aman mesinnya. Menulis virus untuk mendapatkan data dari Dropbox dimungkinkan. Sama dengan kunci yang disimpan secara lokal dan data lokal lainnya. Anda dapat membantu membuatnya lebih aman (pikirkan aplikasi yang membutuhkan kode 5 angka) tetapi pada akhirnya bersifat lokal dan di luar kendali Anda.
Luc Franken

@LucFranken apakah hanya saya atau apakah autologin tampak seperti fitur yang ada di mana-mana? Jika ya, mengapa orang tidak menulis tentang cara melakukannya dengan benar?
Jay Simon

Ini adalah persyaratan yang sangat umum meskipun beberapa perangkat lunak perusahaan lebih tidak mengizinkannya. Misalnya SalesForce hanya memungkinkan untuk menyimpan nama pengguna, bukan kata sandi. Mari kita jelaskan btw. Anda tidak perlu menyimpan kata sandi di klien untuk login. Anda dapat menyimpan hash acak yang sesuai dengan hash di server.
Luc Franken

Jawaban:


12

Salah satu caranya adalah:

  • Saat pengguna masuk, simpan ID sesi dalam cookie di komputer klien (bukan nama pengguna atau kata sandi).
  • Ikat sesi dengan alamat IP, sehingga ID sesi individual hanya berfungsi dengan komputer tempat dimulainya.

Bergantung pada kerangka apa yang Anda gunakan untuk mengembangkan situs Anda, perilaku ini mungkin tersedia sebagai fitur bawaan.

Perhatikan bahwa, karena protokol HTTP tidak memiliki kewarganegaraan, sebenarnya tidak ada perbedaan fungsional antara menjaga seseorang tetap masuk selama satu sesi menggunakan situs web dan "masuk otomatis" saat berikutnya mereka menggunakan situs; ini semata-mata masalah berapa banyak waktu yang Anda izinkan sebelum sesi berakhir.

Perbarui: Juga, gunakan HTTPS untuk meningkatkan keamanan, jelas.

Pembaruan 2: Perhatikan bahwa pendekatan ini memiliki keterbatasan, karena tidak berfungsi dengan baik bagi pengguna yang sering mengubah alamat IP mereka. Namun, ini memberikan tingkat keamanan yang meningkat dan mungkin berguna dalam beberapa situasi.


1
Mengikatnya ke alamat IP tidak banyak membantu karena seseorang mungkin memiliki komputer yang berada di belakang firewall yang sama dengan Anda.
Jay Simon

2
@ JaySimon, saya tidak akan mengatakan "tidak banyak membantu". Jumlah komputer di belakang firewall yang sama dengan Anda jauh lebih kecil dari jumlah komputer di dunia. Ini tentang membatasi potensi serangan Anda, dan ini sangat membatasi. Ini adalah pendekatan standar, dan saya benar-benar tidak berpikir ada banyak yang dapat Anda lakukan di luar itu. Jika seseorang memiliki alamat IP yang sama dengan pengguna dan mengelola untuk mendapatkan ID sesi, orang itu tidak dapat dibedakan dari pengguna dari perspektif server. Jika Anda memiliki segala jenis login di situs Anda, Anda terkena serangan semacam itu.

3
Apakah menurut Anda pendekatan seperti itu akan mengganggu pengguna di ponsel yang alamat IP-nya sering berubah?
Jay Simon

@ JaySimon, jika itu terjadi dalam satu sesi pengguna akan mengalaminya sebagai logout mendadak, yang tentu saja akan mengganggu. Saya tidak tahu seberapa sering mereka benar-benar berubah, (pencarian Google cepat tidak mengungkapkan jawaban yang pasti). Saya tidak akan terlalu khawatir tentang hal itu kecuali IP cenderung berubah saat mereka benar-benar menggunakannya.

Membatasi sesi ke IP tidak benar-benar realistis seperti yang dikatakan. Pengguna sering mengubah lokasi. Dengan ponsel tetapi juga dengan laptop; misalnya flex bekerja. Yang terbaik yang dapat Anda lakukan di sana adalah beberapa pemeriksaan GeoIP yang dikombinasikan dengan waktu untuk menempuh jarak itu; seperti Gmail.
Lode

5

Amazon (dan banyak lainnya) menggunakan pendekatan hybrid. Mereka menyediakan autologin untuk menjelajah, menambahkan item ke troli, dan menempatkan pesanan menggunakan kombinasi alamat pengiriman / pengiriman kredit yang telah Anda gunakan sebelumnya. Namun, mereka mengharuskan Anda memasukkan kata sandi untuk banyak tindakan seperti menambahkan kartu kredit, menambah / mengubah alamat pengiriman, memperbarui kata sandi, melihat pesanan sebelumnya (opsional untuk pengguna), dan banyak pengaturan akun lainnya.

Jadi ya, orang-orang yang mendapatkan akses ke komputer Anda dapat membajak sesi Anda, tetapi Anda masih mendapatkan apa yang mereka pesan! (Lebih penting lagi, insentif untuk membajak suatu sesi cukup banyak ditiadakan.) Tetapi jika seseorang memiliki akses ke komputer saya, saya memiliki masalah lebih besar daripada orang mencuri sesi situs rata-rata.

Jika Anda memiliki bagian dari aplikasi Anda yang tidak memerlukan tingkat keamanan yang tinggi, Anda dapat memilih model hibrid tempat Anda menyimpan ID sesi (hash atau apa pun jika Anda mau) untuk otomatis login pengguna ke bagian situs dengan keamanan rendah dari situs , tetapi mengharuskan mereka untuk memasukkan kata sandi ketika memasuki area keamanan yang lebih tinggi dan menghapus token keamanan tinggi ketika sesi berakhir.

Tentu saja jika ini adalah situs tingkat perbankan, daripada masuk otomatis bukanlah suatu pilihan. Sekali lagi, situs yang menggunakan jenis keamanan ini mengasumsikan nilai dari data yang mereka lindungi dan kenyamanan tambahan bagi pengguna yang keluar menimbang risiko potensial dari sesi yang dibajak. Jika Anda merasa itu tidak berlaku untuk aplikasi Anda, maka jangan menerapkan login otomatis. Anda perlu mengakses tingkat pengorbanan keamanan / kegunaan apa yang sesuai untuk kasus penggunaan Anda.


2

Sebenarnya tidak terlalu sulit. Pertama-tama simpan cookie dengan format ini:

userID.token

Anda dapat menggunakan hash sha1 untuk token. Kemudian di tabel database ingat_me_tokens Anda menyimpan userID, bcrypt hash dari token dan waktu token dihasilkan.

Kemudian ketika seseorang mengunjungi situs Anda, periksa untuk melihat apakah cookie sudah diatur. Jika cookie diatur maka lihat apakah ada baris yang valid untuk itu dalam database dalam 7 hari terakhir katakan. Jika ada baris yang valid dalam database untuk cookie, maka setel sesi untuk mengindikasikan bahwa pengguna login dan juga menghapus baris cookie / database yang cocok dan buat baris cookie / token / database baru.

Jika mereka keluar maka hapus cookie.

Jalankan pekerjaan cron untuk memangkas remember_me_tokens yang lebih tua dari 7 hari.


Apa yang mencegah seseorang menyalin kunci ini dan menempel di mesin mereka dan mendapatkan akses ke akun tanpa nama pengguna atau kata sandi?
Jay Simon

bagaimana Anda akan mendapatkan kuncinya? itu disimpan secara lokal di komputer seseorang.
Ryan

Anda berjalan ke komputer dan membuka file di mana itu disimpan :)
Jay Simon

2
@JaySimon Argumen yang sama ini dapat dibuat untuk seseorang yang masuk dan berjalan pergi selama 5 menit tanpa mengunci komputer mereka, atau mengklik Remember Me dan seseorang melompat menggunakan kata sandi akun mereka. Jika Anda dapat menerima kemungkinan situasi keamanan ini maka kenyamanannya bagus tetapi maka itu sebabnya Anda tidak melihat fitur Remember Me pada daftar CIA NOC :) Server harus memberi Anda semacam token yang harus disimpan oleh klien pada sistem file. Itu tidak lagi di tangan Anda dari perspektif server sekalipun.
maple_shaft

@maple_shaft mengapa ada orang yang terkejut bahwa Anda bisa melakukan itu ke dropbox? (Saya menautkannya dalam pertanyaan saya.)
Jay Simon

0

Anda hanya bisa jika Anda mempercayai perangkat tempat Anda menyimpannya. Terserah pengguna (jika Anda tidak dapat mempengaruhi perangkat) seberapa aman itu. Itu hanya dari tangan Anda.

Sebagaimana dinyatakan dalam komentar:

Ini tentang apa yang Anda percayai. Jika Anda tidak percaya mesin menyimpan ID maka itu adalah masalah Anda. Jika Anda mempercayai gantungan kunci maka itu adalah keamanan maksimum yang akan Anda dapatkan. Tentu saja Anda dapat menambahkan beberapa keamanan khusus seperti mendeteksi perangkat keras atau sesuatu tetapi semuanya palsu sehingga Anda tidak bisa tahu pada akhirnya. Itu di luar kendali Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.