Otentikasi berbasis formulir untuk situs web
Kami percaya bahwa Stack Overflow tidak hanya menjadi sumber daya untuk pertanyaan teknis yang sangat spesifik, tetapi juga untuk pedoman umum tentang cara mengatasi variasi pada masalah umum. "Otentikasi berbasis formulir untuk situs web" harus menjadi topik bagus untuk eksperimen semacam itu.
Ini harus mencakup topik-topik seperti:
- Cara masuk
- Cara keluar
- Cara tetap masuk
- Mengelola cookie (termasuk pengaturan yang disarankan)
- Enkripsi SSL / HTTPS
- Cara menyimpan kata sandi
- Menggunakan pertanyaan rahasia
- Fungsionalitas nama pengguna / kata sandi yang terlupa
- Penggunaan nonces untuk mencegah pemalsuan permintaan lintas situs (CSRF)
- OpenID
- Kotak centang "Ingat saya"
- Pelengkapan otomatis nama pengguna dan kata sandi browser
- URL rahasia (public URL dilindungi oleh digest)
- Memeriksa kekuatan kata sandi
- Validasi email
- dan banyak lagi tentang otentikasi berbasis formulir ...
Seharusnya tidak termasuk hal-hal seperti:
- Peran dan otorisasi
- Otentikasi dasar HTTP
Tolong bantu kami dengan:
- Menyarankan subtopik
- Mengirimkan artikel bagus tentang subjek ini
- Mengedit jawaban resmi
security
http
authentication
language-agnostic
article
Michiel de Mare
sumber
sumber
HttpOnly
Bendera cookie sangat berguna , yang mencegah pencurian cookie berbasis JavaScript (bagian dari serangan XSS), harus disebutkan di suatu tempat juga.Jawaban:
BAGIAN I: Cara Masuk
Kami akan menganggap Anda sudah tahu cara membuat form HTML login + kata sandi yang POST nilainya ke skrip di sisi server untuk otentikasi. Bagian di bawah ini akan membahas pola autentikasi praktis yang baik, dan bagaimana cara menghindari perangkap keamanan yang paling umum.
Ke HTTPS atau tidak ke HTTPS?
Kecuali jika koneksi sudah aman (yaitu, diteruskan melalui HTTPS menggunakan SSL / TLS), nilai-nilai form login Anda akan dikirim dalam teks-jelas, yang memungkinkan siapa pun yang menguping di garis antara browser dan server web akan dapat membaca login saat mereka lewat melalui. Jenis penyadapan ini dilakukan secara rutin oleh pemerintah, tetapi secara umum, kami tidak akan membahas kabel 'milik' selain untuk mengatakan ini: Cukup gunakan HTTPS.
Pada dasarnya, satu-satunya cara praktis untuk melindungi terhadap penyadapan / paket mengendus saat login adalah dengan menggunakan HTTPS atau skema enkripsi berbasis sertifikat lain (misalnya, TLS ) atau skema respons tantangan yang teruji & teruji (misalnya, Diffie-Hellman berbasis SRP). Metode lain dapat dengan mudah dielakkan oleh penyerang menguping.
Tentu saja, jika Anda ingin sedikit tidak praktis, Anda juga dapat menggunakan beberapa bentuk skema otentikasi dua faktor (mis. Aplikasi Google Authenticator, codebook 'gaya perang dingin' fisik, atau dongle generator kunci RSA). Jika diterapkan dengan benar, ini dapat bekerja bahkan dengan koneksi yang tidak aman, tetapi sulit untuk membayangkan bahwa seorang dev akan bersedia untuk menerapkan dua faktor auth tetapi tidak SSL.
(Jangan) Gulung enkripsi / hashing JavaScript Anda sendiri
Mengingat biaya yang dirasakan (meskipun sekarang dapat dihindari ) dan kesulitan teknis dalam menyiapkan sertifikat SSL di situs web Anda, beberapa pengembang tergoda untuk menggulir skema hashing atau enkripsi dalam peramban mereka sendiri untuk menghindari melewati login teks jelas melalui kawat yang tidak aman.
Meskipun ini adalah pemikiran yang mulia, pada dasarnya tidak berguna (dan bisa menjadi kelemahan keamanan ) kecuali jika dikombinasikan dengan salah satu di atas - yaitu, mengamankan garis dengan enkripsi yang kuat atau menggunakan tantangan-respons yang dicoba dan diuji. mekanisme (jika Anda tidak tahu apa itu, hanya tahu bahwa itu adalah salah satu yang paling sulit untuk dibuktikan, paling sulit untuk dirancang, dan paling sulit untuk menerapkan konsep-konsep dalam keamanan digital).
Memang benar bahwa hashing kata sandi bisa efektif terhadap pengungkapan kata sandi , itu rentan terhadap serangan replay, serangan / pembajakan Man-In-The-Middle (jika penyerang dapat menyuntikkan beberapa byte ke halaman HTML tanpa jaminan Anda sebelum mencapai Anda browser, mereka hanya dapat mengomentari hashing dalam JavaScript), atau serangan brute-force (karena Anda menyerahkan penyerang baik nama pengguna, garam dan kata sandi hash).
CAPTCHAS melawan kemanusiaan
CAPTCHA dimaksudkan untuk menggagalkan satu kategori serangan spesifik: kamus-otomatis-percobaan-dan-kesalahan tanpa operator manusia. Tidak ada keraguan bahwa ini adalah ancaman nyata, namun, ada beberapa cara untuk mengatasinya dengan mulus yang tidak memerlukan CAPTCHA, yang dirancang secara khusus dengan baik melalui skema pelambatan login sisi server - kita akan membahasnya nanti.
Ketahuilah bahwa implementasi CAPTCHA tidak dibuat sama; mereka sering tidak dapat dipecahkan oleh manusia, kebanyakan dari mereka sebenarnya tidak efektif terhadap bot, semuanya tidak efektif terhadap tenaga kerja murah dunia ketiga (menurut OWASP , tingkat sweatshop saat ini adalah $ 12 per 500 tes), dan beberapa implementasi mungkin ilegal secara teknis di beberapa negara (lihat Lembar Curang Otentikasi OWASP ). Jika Anda harus menggunakan CAPTCHA, gunakan reCAPTCHA Google , karena ini merupakan definisi OCR-hard (karena menggunakan pemindaian buku yang sudah diklasifikasikan dengan OCR) dan berusaha sangat keras untuk menjadi ramah pengguna.
Secara pribadi, saya cenderung menganggap CAPTCHAS menyebalkan, dan menggunakannya hanya sebagai pilihan terakhir ketika seorang pengguna gagal masuk beberapa kali dan pembatasan pembatasan dipercepat. Ini akan terjadi jarang cukup untuk dapat diterima, dan itu memperkuat sistem secara keseluruhan.
Menyimpan Kata Sandi / Memverifikasi login
Ini mungkin akhirnya menjadi pengetahuan umum setelah semua peretasan yang dipublikasikan dan kebocoran data pengguna yang telah kita lihat dalam beberapa tahun terakhir, tetapi harus dikatakan: Jangan menyimpan kata sandi dalam teks yang jelas dalam database Anda. Basis data pengguna diretas, bocor, atau dikumpulkan secara rutin melalui injeksi SQL, dan jika Anda menyimpan kata sandi mentah, plaintext, itu adalah permainan instan untuk keamanan login Anda.
Jadi, jika Anda tidak dapat menyimpan kata sandi, bagaimana Anda memeriksa bahwa kombinasi login + kata sandi yang dikirim dari formulir login sudah benar? Jawabannya adalah hashing menggunakan fungsi derivasi kunci . Setiap kali pengguna baru dibuat atau kata sandi diubah, Anda mengambil kata sandi dan menjalankannya melalui KDF, seperti Argon2, bcrypt, scrypt atau PBKDF2, mengubah kata sandi cleartext ("correcthorsebatterystaple") menjadi string panjang, yang tampak acak. , yang jauh lebih aman untuk disimpan di basis data Anda. Untuk memverifikasi login, Anda menjalankan fungsi hash yang sama pada kata sandi yang dimasukkan, kali ini meneruskan garam dan membandingkan string hash yang dihasilkan dengan nilai yang disimpan dalam database Anda. Argon2, bcrypt dan scrypt menyimpan garam dengan hash. Lihat artikel ini di sec.stackexchange untuk informasi lebih rinci.
Alasan penggunaan garam adalah bahwa hashing itu sendiri tidak cukup - Anda akan ingin menambahkan apa yang disebut 'garam' untuk melindungi hash terhadap tabel pelangi . Garam secara efektif mencegah dua kata sandi yang sama sekali cocok agar tidak disimpan sebagai nilai hash yang sama, mencegah seluruh basis data dipindai dalam satu kali proses jika penyerang mengeksekusi serangan tebak kata sandi.
Hash kriptografi tidak boleh digunakan untuk penyimpanan kata sandi karena kata sandi yang dipilih pengguna tidak cukup kuat (yaitu biasanya tidak mengandung cukup entropi) dan serangan tebak kata sandi dapat diselesaikan dalam waktu yang relatif singkat oleh penyerang dengan akses ke hash. Inilah sebabnya mengapa KDF digunakan - ini secara efektif "meregangkan kunci" , yang berarti bahwa setiap tebakan kata sandi penyerang membuat beberapa pengulangan algoritma hash, misalnya 10.000 kali, yang menyebabkan penyerang menebak kata sandi 10.000 kali lebih lambat.
Data sesi - "Anda masuk sebagai Spiderman69"
Setelah server memverifikasi login dan kata sandi terhadap database pengguna Anda dan menemukan kecocokan, sistem perlu cara untuk mengingat bahwa browser telah diautentikasi. Fakta ini seharusnya hanya disimpan sisi server dalam data sesi.
Jika memungkinkan, pastikan cookie sesi memiliki tanda aman dan hanya HTTP yang ditetapkan ketika dikirim ke browser. Bendera HttpOnly memberikan perlindungan terhadap cookie yang sedang dibaca melalui serangan XSS. Bendera aman memastikan bahwa cookie hanya dikirim kembali melalui HTTPS, dan karenanya melindungi terhadap serangan jaringan mengendus. Nilai cookie tidak dapat diprediksi. Di mana cookie yang merujuk pada sesi yang tidak ada disajikan, nilainya harus segera diganti untuk mencegah fiksasi sesi .
BAGIAN II: Cara Tetap Masuk - Kotak Centang "Remember Me" yang Terkenal
Cookie Login Persisten (fungsionalitas "ingat saya") adalah zona berbahaya; di satu sisi, mereka sepenuhnya aman seperti login konvensional ketika pengguna mengerti cara menanganinya; dan di sisi lain, mereka adalah risiko keamanan yang sangat besar di tangan pengguna yang ceroboh, yang mungkin menggunakannya di komputer umum dan lupa untuk logout, dan yang mungkin tidak tahu apa itu cookie browser atau bagaimana cara menghapusnya.
Secara pribadi, saya suka login terus-menerus untuk situs web yang saya kunjungi secara teratur, tetapi saya tahu cara menanganinya dengan aman. Jika Anda yakin bahwa pengguna Anda mengetahui hal yang sama, Anda dapat menggunakan login persisten dengan hati nurani yang bersih. Jika tidak - yah, maka Anda dapat berlangganan filosofi bahwa pengguna yang ceroboh dengan kredensial login mereka membawanya sendiri jika mereka diretas. Ini tidak seperti kita pergi ke rumah pengguna kita dan merobek semua catatan Post-It yang menimbulkan wajah dengan kata sandi yang telah mereka antre di ujung monitor mereka.
Tentu saja, beberapa sistem tidak mampu meretas akun apa pun ; untuk sistem seperti itu, tidak ada cara Anda dapat membenarkan memiliki login persisten.
Jika Anda memutuskan untuk menerapkan cookie login persisten, ini adalah bagaimana Anda melakukannya:
Pertama, luangkan waktu untuk membaca artikel Paragon Initiative tentang masalah ini. Anda harus melakukan banyak elemen dengan benar, dan artikel tersebut dapat menjelaskan masing-masing elemen dengan baik.
Dan hanya untuk mengulangi salah satu jebakan yang paling umum, JANGAN MENYIMPAN COOKIE LOGIN YANG TERTENTU (TOKEN) DI DATABASE ANDA, HANYA DENGAN HASH IT! Token masuk adalah Kata Sandi Setara, jadi jika penyerang mendapatkan tangan mereka di basis data Anda, mereka dapat menggunakan token untuk masuk ke akun apa pun, sama seperti jika itu adalah kombinasi kata sandi masuk-kata sandi yang jelas. Oleh karena itu, gunakan hashing (sesuai dengan https://security.stackexchange.com/a/63438/5002 hash yang lemah akan baik-baik saja untuk tujuan ini) ketika menyimpan token login persisten.
BAGIAN III: Menggunakan Pertanyaan Rahasia
Jangan laksanakan 'pertanyaan rahasia' . Fitur 'pertanyaan rahasia' adalah anti-pola keamanan. Baca kertas dari tautan nomor 4 dari daftar HARUS BACA. Anda bisa bertanya kepada Sarah Palin tentang yang itu, setelah dia Yahoo! akun email diretas selama kampanye presiden sebelumnya karena jawaban untuk pertanyaan keamanannya adalah ... "SMA Wasilla"!
Bahkan dengan pertanyaan yang ditentukan pengguna, sangat mungkin sebagian besar pengguna akan memilih:
Pertanyaan rahasia 'standar' seperti nama gadis ibu atau hewan peliharaan favorit
Sepotong hal-hal sepele yang bisa diambil siapa pun dari blog, profil LinkedIn, atau yang serupa
Setiap pertanyaan yang lebih mudah dijawab daripada menebak kata sandi mereka. Yang, untuk kata sandi yang layak, adalah setiap pertanyaan yang dapat Anda bayangkan
Sebagai kesimpulan, pertanyaan keamanan secara inheren tidak aman dalam hampir semua bentuk dan variasinya, dan tidak boleh digunakan dalam skema otentikasi karena alasan apa pun.
Alasan sebenarnya mengapa pertanyaan keamanan bahkan ada di alam liar adalah bahwa mereka dengan mudah menghemat biaya beberapa panggilan dukungan dari pengguna yang tidak dapat mengakses email mereka untuk mendapatkan kode pengaktifan kembali. Ini dengan mengorbankan keamanan dan reputasi Sarah Palin. Setimpal? Mungkin tidak.
BAGIAN IV: Fungsi Kata Sandi Lupa
Saya telah menyebutkan mengapa Anda tidak boleh menggunakan pertanyaan keamanan untuk menangani kata sandi pengguna yang terlupakan / hilang; tidak perlu dikatakan bahwa Anda tidak boleh mengirim email kepada pengguna kata sandi mereka yang sebenarnya. Setidaknya ada dua perangkap yang terlalu umum untuk dihindari dalam bidang ini:
Jangan setel ulang kata sandi yang dilupakan menjadi kata sandi kuat yang dibuat secara otomatis - kata sandi semacam itu sangat sulit diingat, yang berarti pengguna harus mengubahnya atau menuliskannya - katakanlah, pada Post-It kuning cerah di tepi monitor mereka. Alih-alih mengatur kata sandi baru, biarkan pengguna memilih yang baru segera - yang memang ingin mereka lakukan. (Pengecualian untuk hal ini adalah jika pengguna secara universal menggunakan pengelola kata sandi untuk menyimpan / mengelola kata sandi yang biasanya tidak mungkin untuk diingat tanpa menuliskannya).
Selalu hash kode sandi / token yang hilang dalam database. LAGI , kode ini adalah contoh lain dari Setara Kata Sandi, jadi HARUS di-hash seandainya penyerang mendapatkan tangan mereka di basis data Anda. Ketika kode kata sandi yang hilang diminta, kirim kode plaintext ke alamat email pengguna, lalu hash, simpan hash di basis data Anda - dan buang yang asli . Sama seperti kata sandi atau token login yang persisten.
Catatan terakhir: selalu pastikan antarmuka Anda untuk memasukkan 'kode kata sandi yang hilang' setidaknya seaman formulir login Anda sendiri, atau penyerang hanya akan menggunakan ini untuk mendapatkan akses sebagai gantinya. Memastikan Anda membuat 'kode kata sandi hilang' yang sangat lama (misalnya, 16 karakter alfanumerik peka huruf besar-kecil) adalah awal yang baik, tetapi pertimbangkan untuk menambahkan skema pembatasan yang sama yang Anda lakukan untuk formulir login itu sendiri.
BAGIAN V: Memeriksa Kekuatan Kata Sandi
Pertama, Anda ingin membaca artikel kecil ini untuk pemeriksaan realitas: 500 kata sandi paling umum
Oke, jadi mungkin daftar itu bukan daftar kata sandi paling umum yang kanonik pada sistem apa pun di mana pun , tetapi ini adalah indikasi yang baik tentang betapa buruknya orang akan memilih kata sandi mereka ketika tidak ada kebijakan yang diberlakukan. Selain itu, daftar ini terlihat sangat dekat dengan rumah ketika Anda membandingkannya dengan analisis yang tersedia untuk umum atas kata sandi yang baru saja dicuri.
Jadi: Tanpa persyaratan kekuatan kata sandi minimum, 2% pengguna menggunakan salah satu dari 20 kata sandi paling umum. Artinya: jika seorang penyerang hanya mendapat 20 upaya, 1 dari 50 akun di situs web Anda akan dapat di crack.
Untuk menggagalkan ini diperlukan menghitung entropi kata sandi dan kemudian menerapkan ambang batas. Publikasi Khusus Institut Standar dan Teknologi Nasional (NIST) 800-63 memiliki serangkaian saran yang sangat bagus. Bahwa, ketika dikombinasikan dengan analisis tata letak kamus dan keyboard (misalnya, 'qwertyuiop' adalah kata sandi yang buruk), dapat menolak 99% dari semua kata sandi yang dipilih dengan buruk pada level 18 bit entropi. Cukup menghitung kekuatan kata sandi dan menunjukkan pengukur kekuatan visual kepada pengguna adalah baik, tetapi tidak cukup. Kecuali jika diberlakukan, banyak pengguna kemungkinan besar akan mengabaikannya.
Dan untuk kenyamanan pengguna menggunakan kata sandi entropi yang tinggi, Kata Sandi xkcd dari Randall Munroe sangat disarankan.
Memanfaatkan Troy Hunt's Have I Been Pwned API untuk memeriksa kata sandi pengguna terhadap kata sandi yang dikompromikan dalam pelanggaran data publik.
BAGIAN VI: Banyak Lagi - Atau: Mencegah Upaya Masuk Cepat-Api
Pertama, lihat nomornya: Kecepatan Pemulihan Kata Sandi - Berapa lama kata sandi Anda akan bertahan
Jika Anda tidak punya waktu untuk melihat-lihat tabel di tautan itu, berikut daftarnya:
Dibutuhkan hampir tidak ada waktu untuk crack password yang lemah, bahkan jika Anda retak dengan sempoa
Dibutuhkan hampir tidak ada waktu untuk memecahkan sandi 9-karakter alfanumerik jika kasus tidak sensitif
Hampir tidak memerlukan waktu untuk memecahkan kata sandi atas dan simbol huruf dan angka yang rumit, huruf besar dan kecil jika panjangnya kurang dari 8 karakter (PC desktop dapat mencari seluruh ruang tombol hingga 7 karakter dalam suatu hal. hari atau bahkan berjam-jam)
Akan tetapi, ini akan memakan waktu terlalu banyak untuk memecahkan kata sandi 6-karakter, jika Anda dibatasi satu upaya per detik!
Jadi apa yang bisa kita pelajari dari angka-angka ini? Ya, banyak, tapi kita bisa fokus pada bagian terpenting: fakta bahwa mencegah sejumlah besar upaya login berurutan cepat (mis. Serangan brute force ) sebenarnya tidak terlalu sulit. Tetapi mencegahnya dengan benar tidak semudah kelihatannya.
Secara umum, Anda memiliki tiga pilihan yang semuanya efektif terhadap serangan brute-force (dan serangan kamus, tetapi karena Anda sudah menggunakan kebijakan kata sandi yang kuat, mereka seharusnya tidak menjadi masalah) :
Tunjukkan CAPTCHA setelah upaya yang gagal (menjengkelkan sekali dan seringkali tidak efektif - tapi saya mengulangi sendiri di sini)
Mengunci akun dan memerlukan verifikasi email setelah upaya N gagal (ini adalah serangan DoS yang menunggu untuk terjadi)
Dan akhirnya, masuknya pembatasan : yaitu, menetapkan penundaan waktu antara upaya setelah upaya N gagal (ya, serangan DoS masih mungkin, tetapi setidaknya mereka jauh lebih kecil kemungkinannya dan jauh lebih rumit untuk dilakukan).
Praktik terbaik # 1: Penundaan waktu singkat yang meningkat dengan jumlah upaya gagal, seperti:
DoS menyerang skema ini akan sangat tidak praktis, karena waktu penguncian yang dihasilkan sedikit lebih besar dari jumlah waktu penguncian sebelumnya.
Praktik terbaik # 2: Penundaan waktu menengah yang mulai berlaku setelah N gagal dilakukan, seperti:
DoS menyerang skema ini akan sangat tidak praktis, tetapi tentu bisa dilakukan. Juga, mungkin relevan untuk dicatat bahwa penundaan yang lama dapat sangat mengganggu bagi pengguna yang sah. Pengguna yang pelupa akan membenci Anda.
Praktik terbaik # 3: Menggabungkan dua pendekatan - baik penundaan waktu tetap, yang berlaku setelah N gagal upaya, seperti:
Atau, penundaan yang meningkat dengan batas atas tetap, seperti:
Skema akhir ini diambil dari saran praktik terbaik OWASP (tautan 1 dari daftar HARUS-BACA) dan harus dianggap praktik terbaik, meskipun diakui di sisi restriktif.
DoS yang menyerang skema pembatasan masuk akhir ini akan sangat tidak praktis. Dan sebagai sentuhan terakhir, selalu izinkan login persisten (cookie) (dan / atau formulir login yang diverifikasi CAPTCHA) untuk dilewati, sehingga pengguna yang sah bahkan tidak akan tertunda saat serangan sedang berlangsung . Dengan begitu, serangan DoS yang sangat tidak praktis menjadi serangan yang sangat tidak praktis.
Selain itu, masuk akal untuk melakukan pelambatan yang lebih agresif pada akun admin, karena itu adalah titik masuk paling menarik
BAGIAN VII: Serangan Brute Force Terdistribusi
Selain itu, penyerang yang lebih maju akan mencoba untuk menghindari pembatasan masuk dengan 'menyebarkan aktivitas mereka':
Mendistribusikan upaya pada botnet untuk mencegah penandaan alamat IP
Alih-alih memilih satu pengguna dan mencoba 50.000 kata sandi paling umum (yang tidak dapat mereka lakukan, karena pelambatan kami), mereka akan memilih kata sandi yang paling umum dan mencobanya terhadap 50.000 pengguna. Dengan begitu, mereka tidak hanya menyiasati upaya upaya maksimum seperti CAPTCHA dan pembatasan masuk, peluang mereka untuk sukses juga meningkat, karena kata sandi paling umum nomor 1 jauh lebih mungkin daripada angka 49,995
Menempatkan permintaan login untuk setiap akun pengguna, katakanlah, terpisah 30 detik, untuk menyelinap di bawah radar
Di sini, praktik terbaik adalah mencatat jumlah login gagal, sistem keseluruhan , dan menggunakan rata-rata berjalan dari frekuensi login buruk situs Anda sebagai dasar untuk batas atas yang kemudian Anda terapkan pada semua pengguna.
Terlalu abstrak? Biarkan saya ulangi:
Katakanlah situs Anda memiliki rata-rata 120 login buruk per hari selama 3 bulan terakhir. Menggunakan itu (rata-rata berjalan), sistem Anda mungkin menetapkan batas global menjadi 3 kali lipatnya - yaitu. 360 upaya gagal selama periode 24 jam. Kemudian, jika jumlah total upaya gagal di semua akun melebihi jumlah itu dalam satu hari (atau bahkan lebih baik, pantau laju akselerasi dan pemicu pada ambang yang dihitung), itu akan mengaktifkan pembatasan masuk sistem-lebar - artinya penundaan singkat untuk SEMUA pengguna (masih, dengan pengecualian login cookie dan / atau login CAPTCHA cadangan).
Saya juga memposting pertanyaan dengan lebih detail dan diskusi yang sangat bagus tentang bagaimana menghindari pitfals yang rumit dalam menangkis serangan brute force terdistribusi
BAGIAN VIII: Penyedia Otentikasi Dua-Faktor dan Otentikasi
Kredensial dapat dikompromikan, apakah dengan eksploitasi, kata sandi yang ditulis dan hilang, laptop dengan kunci dicuri, atau pengguna yang masuk ke situs phishing. Login dapat lebih jauh dilindungi dengan otentikasi dua faktor, yang menggunakan faktor out-of-band seperti kode sekali pakai yang diterima dari panggilan telepon, pesan SMS, aplikasi, atau dongle. Beberapa penyedia menawarkan layanan otentikasi dua faktor.
Otentikasi dapat sepenuhnya didelegasikan ke layanan akses masuk tunggal, tempat penyedia lain menangani pengumpulan kredensial. Ini mendorong masalah ke pihak ketiga yang tepercaya. Google dan Twitter keduanya menyediakan layanan SSO berbasis standar, sementara Facebook menyediakan solusi eksklusif yang serupa.
TAUTAN HARUS BACA Tentang Otentikasi Web
sumber
Artikel definitif
Mengirimkan kredensial
Satu-satunya cara praktis untuk mengirim kredensial 100% aman adalah dengan menggunakan SSL . Menggunakan JavaScript untuk hash kata sandi tidak aman. Perangkap umum untuk hashing kata sandi sisi klien:
Ada metode aman lain yang disebut SRP , tetapi dipatenkan (meskipun dilisensikan secara bebas ) dan ada beberapa implementasi yang baik tersedia.
Menyimpan kata sandi
Jangan pernah menyimpan kata sandi sebagai plaintext dalam database. Bahkan jika Anda tidak peduli dengan keamanan situs Anda sendiri. Asumsikan bahwa beberapa pengguna Anda akan menggunakan kembali kata sandi dari rekening bank online mereka. Jadi, simpan kata sandi hash, dan buang yang asli. Dan pastikan kata sandi tidak muncul di log akses atau log aplikasi. OWASP merekomendasikan penggunaan Argon2 sebagai pilihan pertama Anda untuk aplikasi baru. Jika ini tidak tersedia, PBKDF2 atau scrypt harus digunakan sebagai gantinya. Dan akhirnya jika tidak ada yang di atas tersedia, gunakan bcrypt.
Hash dengan sendirinya juga tidak aman. Misalnya, kata sandi identik berarti hash identik - ini membuat tabel pencarian hash cara yang efektif untuk memecahkan banyak kata sandi sekaligus. Sebagai gantinya, simpan hash asin . Garam adalah string yang ditambahkan ke kata sandi sebelum hashing - gunakan garam (acak) yang berbeda untuk setiap pengguna. Garam adalah nilai publik, sehingga Anda dapat menyimpannya dengan hash dalam database. Lihat di sini untuk lebih lanjut tentang ini.
Ini berarti Anda tidak dapat mengirim kata sandi yang terlupakan kepada pengguna (karena Anda hanya memiliki hash). Jangan setel ulang kata sandi pengguna kecuali Anda telah mengautentikasi pengguna (pengguna harus membuktikan bahwa mereka dapat membaca email yang dikirim ke alamat email yang disimpan (dan divalidasi).)
Pertanyaan keamanan
Pertanyaan keamanan tidak aman - hindari menggunakannya. Mengapa? Apa pun yang dilakukan pertanyaan keamanan, kata sandi akan lebih baik. Baca BAGIAN III: Menggunakan Pertanyaan Rahasia dalam jawaban Roland @ sini di wiki ini.
Cookie sesi
Setelah pengguna log in, server mengirimkan cookie sesi kepada pengguna. Server dapat mengambil nama pengguna atau id dari cookie, tetapi tidak ada orang lain yang dapat menghasilkan cookie seperti itu (TODO menjelaskan mekanisme).
Cookie dapat dibajak : mereka hanya seaman mesin klien dan komunikasi lainnya. Mereka dapat dibaca dari disk, mengendus lalu lintas jaringan, diangkat oleh serangan skrip lintas situs, dihapus dari DNS yang diracuni sehingga klien mengirim cookie mereka ke server yang salah. Jangan mengirim cookie terus-menerus. Cookie harus kedaluwarsa pada akhir sesi klien (browser tutup atau meninggalkan domain Anda).
Jika Anda ingin autologin pada pengguna Anda, Anda dapat mengatur cookie tetap, tetapi harus berbeda dari cookie sesi penuh. Anda dapat mengatur bendera tambahan yang telah login otomatis oleh pengguna, dan harus masuk secara nyata untuk operasi sensitif. Ini populer di situs belanja yang ingin memberi Anda pengalaman berbelanja yang dipersonalisasi dengan mulus namun tetap melindungi detail keuangan Anda. Misalnya, ketika Anda kembali mengunjungi Amazon, mereka menunjukkan kepada Anda halaman yang terlihat seperti Anda masuk, tetapi ketika Anda melakukan pemesanan (atau mengubah alamat pengiriman, kartu kredit, dll.), Mereka meminta Anda untuk mengonfirmasi kata sandi Anda.
Situs web keuangan seperti bank dan kartu kredit, di sisi lain, hanya memiliki data sensitif dan tidak boleh memungkinkan masuk otomatis atau mode keamanan rendah.
Daftar sumber daya eksternal
artikel akademik 21 halaman dengan banyak tips hebat.
diskusi Forum Otentikasi Pengguna mengenai masalah ini
Artikel Pengantar yang salah tentang menyimpan kata sandi
Forum diskusi tentang artikel Coding Horror.
Peringatan lain tentang menyimpan kata sandi dalam database.
artikel Wikipedia tentang kelemahan beberapa skema hashing kata sandi.
Diskusi tentang tabel pelangi dan cara mempertahankannya, dan terhadap utas lainnya. Termasuk diskusi yang luas.
sumber
Pertama, peringatan kuat bahwa jawaban ini bukan yang paling cocok untuk pertanyaan yang tepat ini. Pasti bukan jawaban atas!
Saya akan melanjutkan dan menyebutkan BrowserID yang diusulkan Mozilla (atau mungkin lebih tepatnya, Protokol Email Terverifikasi ) dengan semangat menemukan jalur peningkatan ke pendekatan yang lebih baik untuk otentikasi di masa mendatang.
Saya akan meringkasnya seperti ini:
@
domain " singkat dan didukung oleh berbagai protokol dan skema URI. Pengidentifikasi seperti itu, tentu saja, paling dikenal secara universal sebagai alamat email.Ini bukan semata “otentikasi berbasis formulir untuk situs web”. Tetapi ini merupakan upaya untuk beralih dari norma autentikasi berbasis form saat ini ke sesuatu yang lebih aman: otentikasi yang didukung browser.
sumber
Saya hanya berpikir saya akan membagikan solusi ini yang saya temukan berfungsi dengan baik.
Saya menyebutnya Lapangan Dummy (meskipun saya belum menemukan ini jadi jangan beri kredit pada saya).
Singkatnya: Anda hanya perlu memasukkan ini ke dalam
<form>
dan memeriksa isinya kosong saat memvalidasi:Triknya adalah mengelabui bot agar berpikir ia harus memasukkan data ke bidang yang diperlukan, itulah sebabnya saya menamakan input "email". Jika Anda sudah memiliki bidang yang disebut email yang Anda gunakan, Anda harus mencoba memberi nama bidang dummy yang lain seperti "perusahaan", "telepon" atau "alamat email". Pilih saja sesuatu yang Anda tahu tidak Anda butuhkan dan apa yang terdengar seperti sesuatu yang biasanya orang temukan logis untuk diisi ke dalam formulir web. Sekarang sembunyikan
input
bidang menggunakan CSS atau JavaScript / jQuery - apa pun yang paling cocok untuk Anda - hanya jangan atur inputtype
kehidden
atau bot tidak akan jatuh untuk itu.Ketika Anda memvalidasi formulir (baik klien atau sisi server) periksa apakah bidang boneka Anda telah diisi untuk menentukan apakah itu dikirim oleh manusia atau bot.
Contoh:
Dalam kasus manusia: Pengguna tidak akan melihat bidang dummy (dalam kasus saya bernama "email") dan tidak akan berusaha untuk mengisinya. Jadi nilai bidang boneka masih harus kosong ketika formulir telah dikirim.
Dalam kasus bot: Bot akan melihat bidang yang jenis
text
dan namanyaemail
(atau apa pun sebutannya) dan secara logis akan berusaha mengisinya dengan data yang sesuai. Tidak masalah jika Anda menata form input dengan beberapa CSS mewah, pengembang web selalu melakukannya. Apa pun nilainya di bidang boneka, kami tidak peduli asalkan lebih besar dari0
karakter.Saya menggunakan metode ini pada buku tamu dalam kombinasi dengan CAPTCHA , dan saya belum melihat satu pun pos spam sejak itu. Saya telah menggunakan solusi CAPTCHA saja sebelumnya, tetapi pada akhirnya, itu menghasilkan sekitar lima pos spam setiap jam. Menambahkan bidang dummy dalam formulir telah menghentikan (setidaknya sampai sekarang) semua spam agar tidak muncul.
Saya percaya ini juga bisa digunakan dengan form login / otentikasi.
Peringatan : Tentu saja metode ini bukan 100% sangat mudah. Bot dapat diprogram untuk mengabaikan bidang input dengan gaya yang
display:none
diterapkan padanya. Anda juga harus memikirkan orang yang menggunakan beberapa bentuk pelengkapan otomatis (seperti kebanyakan peramban memiliki bawaan!) Untuk mengisi otomatis semua bidang formulir bagi mereka. Mereka mungkin juga mengambil bidang boneka.Anda juga dapat mengubah sedikit ini dengan membiarkan bidang boneka terlihat tetapi di luar batas layar, tetapi ini sepenuhnya terserah Anda.
Jadilah kreatif!
sumber
visibility:hidden
dan jugaposition:absolute;top:-9000px
Anda juga dapat melakukantext-indent
dan jugaz-index
pada beberapa elemen ini dan menempatkannya dalam nama file CSS terkompresi dengan nama canggung - karena bot dapat mendeteksi 1 tampilan: tidak ada `dan mereka sekarang memeriksa berbagai kombinasi - saya benar-benar menggunakan metode ini dan itu trik lama dari perdagangan. +1<input type="text" name="email" class="cucaracha">
dan di CSS Anda:.cucaracha { display:none; }
.Saya tidak berpikir jawaban di atas adalah "salah" tetapi ada area besar otentikasi yang tidak tersentuh (atau lebih tepatnya penekanannya pada "bagaimana menerapkan sesi cookie", bukan pada "opsi apa yang tersedia dan apa perdagangannya) -offs ".
Editan / jawaban yang saya sarankan adalah
JANGAN mencoba menerapkan formulir login Anda sendiri atau penyimpanan basis data kata sandi, kecuali jika data yang disimpan tidak bernilai pada pembuatan akun dan dihasilkan sendiri (yaitu, gaya web 2.0 seperti Facebook, Flickr , dll.)
Ini menghindari segala kebutuhan untuk memiliki "sesi" atau cookie karena browser itu sendiri akan mengenkripsi ulang komunikasi setiap kali. Ini adalah pendekatan pengembangan yang paling "ringan".
Namun, saya tidak merekomendasikan ini, kecuali untuk layanan publik yang bernilai rendah. Ini adalah masalah dengan beberapa jawaban lain di atas - jangan coba menerapkan kembali mekanisme otentikasi sisi server - masalah ini telah dipecahkan dan didukung oleh sebagian besar browser utama. Jangan gunakan cookie. Jangan menyimpan apa pun di database linting tangan Anda sendiri. Tanyakan saja, sesuai permintaan, jika permintaan itu dikonfirmasi. Segala sesuatu yang lain harus didukung oleh konfigurasi dan perangkat lunak tepercaya pihak ketiga.
Jadi ...
Pertama, kami mengacaukan pembuatan awal akun (dengan kata sandi) dengan memeriksa ulang kata sandi selanjutnya. Jika saya Flickr dan membuat situs Anda untuk pertama kalinya, pengguna baru memiliki akses ke nilai nol (ruang web kosong). Saya benar-benar tidak peduli jika orang yang membuat akun berbohong tentang nama mereka. Jika saya membuat akun rumah sakit intranet / extranet, nilai terletak pada semua catatan medis, dan jadi saya lakukan peduli tentang identitas (*) dari pembuat akun.
Ini adalah bagian yang sangat sulit. Satu- satunya solusi yang layak adalah jaringan kepercayaan. Misalnya, Anda bergabung dengan rumah sakit sebagai dokter. Anda membuat halaman web yang dihosting di suatu tempat dengan foto Anda, nomor paspor Anda, dan kunci publik, dan hash semuanya dengan kunci pribadi. Anda kemudian mengunjungi rumah sakit dan administrator sistem melihat paspor Anda, melihat apakah foto tersebut cocok dengan Anda, dan kemudian memotong hash halaman web / foto dengan kunci pribadi rumah sakit. Mulai sekarang kita dapat bertukar kunci dan token dengan aman. Seperti halnya siapa pun yang mempercayai rumah sakit (ada BTW saus rahasia). Administrator sistem juga dapat memberi Anda dongle RSA atau otentikasi dua faktor lainnya.
Tapi ini adalah banyak kerumitan, dan tidak sangat web 2.0. Namun, itu adalah satu-satunya cara aman untuk membuat akun baru yang memiliki akses ke informasi berharga yang tidak dibuat sendiri.
Kerberos dan SPNEGO - mekanisme masuk tunggal dengan pihak ketiga yang tepercaya - pada dasarnya pengguna memverifikasi terhadap pihak ketiga yang tepercaya. (NB ini sama sekali bukan OAuth yang tidak bisa dipercaya )
SRP - semacam otentikasi kata sandi pintar tanpa pihak ketiga yang tepercaya. Tapi di sini kita masuk ke ranah "lebih aman untuk menggunakan otentikasi dua faktor, bahkan jika itu lebih mahal"
Sisi klien SSL - memberikan klien sertifikat kunci publik (dukungan di semua browser utama - tetapi menimbulkan pertanyaan atas keamanan mesin klien).
Pada akhirnya, ini merupakan tradeoff - berapa biaya pelanggaran keamanan vs biaya penerapan pendekatan yang lebih aman. Suatu hari, kita mungkin melihat PKI yang tepat diterima secara luas sehingga tidak ada lagi formulir autentikasi dan basis data yang digulirkan. Suatu hari...
sumber
Saat hashing, jangan gunakan algoritma hash cepat seperti MD5 (banyak implementasi perangkat keras ada). Gunakan sesuatu seperti SHA-512. Untuk kata sandi, hash yang lebih lambat lebih baik.
Semakin cepat Anda dapat membuat hash, semakin cepat pemeriksa kasar dapat bekerja. Karena itu, hash yang lebih lambat akan memperlambat pemaksaan kasar. Algoritma hash yang lambat akan membuat brute force menjadi tidak praktis untuk kata sandi yang lebih panjang (8 digit +)
sumber
Artikel bagus tentang estimasi kekuatan kata sandi yang realistis adalah:
Dropbox Tech Blog »Blog Archive» zxcvbn: estimasi kekuatan kata sandi realistis
sumber
Aturan favorit saya dalam hal sistem otentikasi: gunakan frasa sandi, bukan kata sandi. Mudah diingat, sulit retak. Info selengkapnya: Coding Horror: Kata Sandi vs. Frasa Lulus
sumber
Saya ingin menambahkan satu saran yang saya gunakan, berdasarkan pertahanan secara mendalam. Anda tidak perlu memiliki sistem auth & auth yang sama untuk admin seperti pengguna biasa. Anda dapat memiliki formulir login terpisah pada url terpisah yang mengeksekusi kode terpisah untuk permintaan yang akan memberikan hak istimewa tinggi. Yang satu ini dapat membuat pilihan yang akan sangat menyakitkan bagi pengguna biasa. Salah satu yang saya gunakan adalah untuk benar-benar mengacak URL login untuk akses admin dan mengirim email baru ke admin untuk URL baru. Menghentikan serangan brute force segera karena URL baru Anda bisa sulit secara acak (string acak sangat panjang) tetapi satu-satunya ketidaknyamanan pengguna admin Anda mengikuti tautan di email mereka. Penyerang tidak lagi tahu ke mana harus POST.
sumber
Saya tidak tahu apakah sebaiknya menjawab ini sebagai jawaban atau sebagai komentar. Saya memilih opsi pertama.
Mengenai poing BAGIAN IV: Lupa Kata Sandi Fungsionalitas dalam jawaban pertama, saya akan membuat titik tentang Timing Attacks.
Dalam formulir Ingat kata sandi Anda , penyerang berpotensi memeriksa daftar email lengkap dan mendeteksi yang terdaftar pada sistem (lihat tautan di bawah).
Mengenai Formulir Kata Sandi yang Terlupakan, saya akan menambahkan bahwa itu adalah ide yang baik untuk menyamakan waktu antara pertanyaan yang berhasil dan tidak berhasil dengan beberapa fungsi penundaan.
https://crypto.stanford.edu/~dabo/papers/webtiming.pdf
sumber
Saya ingin menambahkan satu komentar yang sangat penting: -
Banyak perusahaan menyebarkan situs web "hanya penggunaan internal" yang, secara efektif, "aplikasi perusahaan" yang kebetulan telah diimplementasikan melalui URL. URL-URL ini (seharusnya ...) hanya dapat diselesaikan dalam "jaringan internal perusahaan." (Jaringan mana yang secara ajaib mencakup semua 'pejuang jalan' yang terhubung dengan VPN)
Ketika seorang pengguna patuh terhubung ke jaringan tersebut di atas, identitas mereka ("otentikasi") adalah [sudah ...] "diketahui secara meyakinkan," sebagaimana izin mereka ("otorisasi") untuk melakukan hal-hal tertentu ... seperti. .. "untuk mengakses situs web ini."
Layanan "autentikasi + otorisasi" ini dapat disediakan oleh beberapa teknologi berbeda, seperti LDAP (Microsoft OpenDirectory) , atau Kerberos.
Dari sudut pandang Anda, Anda cukup tahu ini: bahwa siapa pun yang secara sah berakhir di situs web Anda harus disertai oleh [variabel lingkungan yang secara ajaib mengandung ...] a "token." ( Yaitu tidak adanya token semacam itu harus menjadi alasan langsung
404 Not Found
.)Nilai token tidak masuk akal bagi Anda, tetapi, jika perlu muncul, "sarana yang sesuai ada" di mana situs web Anda dapat "[secara otoritatif] bertanya kepada seseorang yang tahu (LDAP ... dll.)" Tentang setiap dan setiap (!) pertanyaan yang mungkin Anda miliki. Dengan kata lain, Anda tidak memanfaatkan diri dari setiap "logika rumah-tumbuh." Sebagai gantinya, Anda menanyakan Otoritas dan secara implisit mempercayai putusannya.
Uh huh ... ini cukup mental beralih dari "Internet liar dan wol."
sumber
Gunakan OpenID Connect atau Akses Dikelola Pengguna .
Karena tidak ada yang lebih efisien daripada tidak melakukannya sama sekali.
sumber