Panduan definitif untuk otentikasi situs web berbasis formulir [ditutup]

5372

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:

  1. Menyarankan subtopik
  2. Mengirimkan artikel bagus tentang subjek ini
  3. Mengedit jawaban resmi
Michiel de Mare
sumber
52
Mengapa mengecualikan HTTP Basic Authentication? Ia dapat bekerja dalam Formulir HTML melalui Ajax: peej.co.uk/articles/http-auth-with-html-forms.html
system PAUSE
55
HTTP Basic Auth memiliki properti yang (relatif) sulit untuk membuat browser lupa. Ini juga sangat tidak aman jika Anda tidak menggunakannya dengan SSL untuk mengamankan koneksi (yaitu, HTTPS).
Donal Fellows
24
Saya pikir itu layak untuk berbicara tentang sesi (termasuk fiksasi dan pembajakan) cookie (bendera aman dan http saja) SSO berbasis HTTP
symcbean
29
HttpOnlyBendera cookie sangat berguna , yang mencegah pencurian cookie berbasis JavaScript (bagian dari serangan XSS), harus disebutkan di suatu tempat juga.
Alan H.
80
Wow. Jawaban panjang, lusinan upvotes untuk sebagian dari mereka, namun tidak ada yang menyebutkan kesalahan umum dalam melayani formulir masuk melalui HTTP. Saya bahkan berdebat dengan orang-orang yang mengatakan "tapi itu tunduk pada https: // ..." dan hanya mendapat tatapan kosong ketika saya bertanya apakah mereka yakin seorang penyerang tidak menulis ulang halaman yang tidak dienkripsi. .
dzuelke

Jawaban:

3764

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 Anda tidak terbiasa dengan data sesi, inilah cara kerjanya: Satu string yang dihasilkan secara acak disimpan dalam cookie yang kedaluwarsa dan digunakan untuk referensi koleksi data - data sesi - yang disimpan di server. Jika Anda menggunakan kerangka kerja MVC, ini sudah pasti ditangani.

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:

  1. 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.

  2. 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:

  1. 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).

  2. 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:

  1. Dibutuhkan hampir tidak ada waktu untuk crack password yang lemah, bahkan jika Anda retak dengan sempoa

  2. Dibutuhkan hampir tidak ada waktu untuk memecahkan sandi 9-karakter alfanumerik jika kasus tidak sensitif

  3. 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)

  4. 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:

  • 1 percobaan gagal = tidak ada penundaan
  • 2 percobaan gagal = 2 detik keterlambatan
  • 3 upaya gagal = 4 detik penundaan
  • 4 percobaan gagal = 8 detik keterlambatan
  • 5 upaya gagal = 16 detik keterlambatan
  • dll.

DoS menyerang skema ini akan sangat tidak praktis, karena waktu penguncian yang dihasilkan sedikit lebih besar dari jumlah waktu penguncian sebelumnya.

Untuk mengklarifikasi: Penundaan bukan penundaan sebelum mengembalikan respons ke browser. Ini lebih seperti batas waktu atau periode refraktori di mana upaya masuk ke akun tertentu atau dari alamat IP tertentu tidak akan diterima atau dievaluasi sama sekali. Artinya, kredensial yang benar tidak akan kembali dalam login yang berhasil, dan kredensial yang salah tidak akan memicu peningkatan keterlambatan.

Praktik terbaik # 2: Penundaan waktu menengah yang mulai berlaku setelah N gagal dilakukan, seperti:

  • 1-4 usaha yang gagal = tidak ada penundaan
  • 5 percobaan gagal = 15-30 menit keterlambatan

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:

  • 1-4 usaha yang gagal = tidak ada penundaan
  • 5+ upaya gagal = 20 detik keterlambatan

Atau, penundaan yang meningkat dengan batas atas tetap, seperti:

  • 1 percobaan gagal = 5 detik penundaan
  • 2 percobaan gagal = 15 detik keterlambatan
  • 3+ upaya gagal = penundaan 45 detik

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.

Sebagai aturan praktis, saya akan mengatakan: semakin kuat kebijakan kata sandi Anda, semakin sedikit Anda harus mengganggu pengguna dengan penundaan. Jika Anda memerlukan 9+ kata sandi karakter yang kuat (alfanumerik peka + angka yang diperlukan), Anda dapat memberikan pengguna 2-4 upaya kata sandi yang tidak tertunda sebelum mengaktifkan pembatasan.

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

  1. OWASP Guide To Authentication / OWASP Authentication Sheet Cheat
  2. Dos dan Larangan Otentikasi Klien di Web (makalah penelitian MIT yang sangat mudah dibaca)
  3. Wikipedia: Cookie HTTP
  4. Pertanyaan pengetahuan pribadi untuk otentikasi fallback: Pertanyaan keamanan di era Facebook (makalah penelitian Berkeley yang sangat mudah dibaca)
Jens Roland
sumber
67
Yah, saya tidak benar-benar setuju dengan bagian Captcha, ya Captcha menyebalkan dan mereka dapat rusak (kecuali recaptcha tetapi ini hampir tidak dapat dipecahkan oleh manusia!) Tapi ini persis seperti mengatakan tidak menggunakan filter spam karena memiliki kurang dari 0,1% negatif palsu .. situs ini menggunakan Captcha, mereka tidak sempurna tetapi mereka memotong sejumlah besar spam dan tidak ada alternatif yang baik untuk mereka
Waleed Eissa
235
@ Jeff: Saya menyesal mendengar bahwa Anda memiliki masalah dengan balasan saya. Saya tidak tahu ada perdebatan tentang Meta tentang jawaban ini, saya akan dengan senang hati mengeditnya sendiri jika Anda memintanya. Dan menghapus posting saya hanya menghapus 1.200 reputasi dari akun saya, yang menyakitkan :(
Jens Roland
13
"Setelah mengirim token otentikasi, sistem perlu cara untuk mengingat bahwa Anda telah diautentikasi - fakta ini seharusnya hanya disimpan di sisi server dalam data sesi. Cookie dapat digunakan untuk referensi data sesi." Tidak terlalu. Anda dapat (dan seharusnya, untuk server stateless!) Menggunakan cookie yang ditandatangani secara kriptografis. Itu tidak mungkin dipalsukan, tidak mengikat sumber daya server, dan tidak perlu sesi lengket atau gangguan lainnya.
Martin Probst
12
"PC desktop dapat mencari FULL KEYSPACE hingga 7 karakter dalam waktu kurang dari 90 hari" Sebuah mesin dengan GPU terbaru dapat mencari ruang tombol 7 karakter penuh dalam waktu kurang dari 1 hari. GPU teratas dapat mengelola 1 miliar hash per detik. golubev.com/hashgpu.htm Ini mengarah pada beberapa kesimpulan tentang penyimpanan kata sandi yang tidak ditangani secara langsung.
Frank Farmer
9
Saya terkejut bahwa perlindungan CSRF belum disebutkan ...
Flukey
418

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:

  • Jika koneksi antara klien dan server tidak terenkripsi, semua yang Anda lakukan rentan terhadap serangan man-in-the-middle . Seorang penyerang dapat mengganti javascript yang masuk untuk memecah hashing atau mengirim semua kredensial ke server mereka, mereka dapat mendengarkan tanggapan klien dan menyamar sebagai pengguna dengan sempurna, dll. SSL dengan Otoritas Sertifikat tepercaya dirancang untuk mencegah serangan MitM.
  • Kata sandi hash yang diterima oleh server kurang aman jika Anda tidak melakukan pekerjaan tambahan yang berlebihan di server.

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

Michiel de Mare
sumber
1
Mengingat kerentanan MITM baru-baru ini di sekitar sertifikat SSL yang ditandatangani ( blog.startcom.org/?p=145 ) sehingga kombinasi SSL dan beberapa jenis otentikasi respons Tantangan (Ada alternatif untuk SRP) mungkin merupakan solusi yang lebih baik.
Kevin Loney
banyak hal ini bersifat situasional. saya cenderung tidak menggunakan cookie sesi sama sekali. cookie yang dibajak hampir selalu merupakan kesalahan server. Pria di tengah / paket sniffing arent yang umum
Shawn
Paket BCrypt Nuget: nuget.org/List/Packages/BCrypt
Fabian Vilers
1
Catatan 1 tentang jawaban ini: ini adalah konsep, untuk diedit sebagai wiki. Jika Anda dapat mengedit ini, Anda dipersilakan untuk.
Peter Mortensen
SRP khusus untuk kehadiran beberapa pihak jika saya mengerti dengan baik
Webwoman
162

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:

  1. Mozilla adalah organisasi nirlaba dengan nilai - nilai yang selaras dengan menemukan solusi yang baik untuk masalah ini.
  2. Kenyataan saat ini adalah bahwa sebagian besar situs web menggunakan otentikasi berbasis formulir
  3. Otentikasi berbasis formulir memiliki kelemahan besar, yang merupakan peningkatan risiko phishing . Pengguna diminta untuk memasukkan informasi sensitif ke area yang dikendalikan oleh entitas jarak jauh, bukan area yang dikendalikan oleh Agen Pengguna mereka (browser).
  4. Karena peramban dipercayai secara implisit (seluruh gagasan Agen Pengguna adalah bertindak atas nama Pengguna), mereka dapat membantu memperbaiki situasi ini.
  5. Kekuatan utama yang menahan kemajuan di sini adalah kebuntuan penempatan . Solusi harus didekomposisi menjadi langkah-langkah yang memberikan beberapa keuntungan tambahan sendiri.
  6. Metode desentralisasi paling sederhana untuk mengekspresikan identitas yang dibangun ke dalam infrastruktur internet adalah nama domain.
  7. Sebagai tingkat kedua dari pengungkapan identitas, setiap domain mengelola set akunnya sendiri.
  8. Formulir “akun@ domain " singkat dan didukung oleh berbagai protokol dan skema URI. Pengidentifikasi seperti itu, tentu saja, paling dikenal secara universal sebagai alamat email.
  9. Penyedia email sudah menjadi penyedia identitas primer de-facto online. Alur pengaturan ulang kata sandi saat ini biasanya memungkinkan Anda mengendalikan akun jika Anda dapat membuktikan bahwa Anda mengontrol alamat email yang terkait dengan akun itu.
  10. Protokol Email Terverifikasi diusulkan untuk memberikan metode yang aman, berdasarkan kriptografi kunci publik, untuk merampingkan proses pembuktian ke domain B bahwa Anda memiliki akun di domain A.
  11. Untuk browser yang tidak mendukung Protokol Email Terverifikasi (saat ini semuanya), Mozilla menyediakan shim yang mengimplementasikan protokol dalam kode JavaScript sisi klien.
  12. Untuk layanan email yang tidak mendukung Protokol Email Terverifikasi, protokol tersebut memungkinkan pihak ketiga untuk bertindak sebagai perantara tepercaya, dengan menyatakan bahwa mereka telah memverifikasi kepemilikan pengguna atas suatu akun. Tidak diinginkan memiliki banyak pihak ketiga; kemampuan ini dimaksudkan hanya untuk memungkinkan jalur peningkatan, dan lebih disukai bahwa layanan email menyediakan pernyataan ini sendiri.
  13. Mozilla menawarkan layanan mereka sendiri untuk bertindak seperti pihak ketiga yang tepercaya. Penyedia Layanan (yaitu, Mengandalkan Pihak) yang mengimplementasikan Protokol Email Terverifikasi dapat memilih untuk mempercayai pernyataan Mozilla atau tidak. Layanan Mozilla memverifikasi kepemilikan akun pengguna menggunakan cara konvensional mengirim email dengan tautan konfirmasi.
  14. Penyedia Layanan dapat, tentu saja, menawarkan protokol ini sebagai opsi selain metode otentikasi lainnya yang mungkin ingin mereka tawarkan.
  15. Manfaat antarmuka pengguna besar yang dicari di sini adalah "pemilih identitas". Ketika pengguna mengunjungi situs dan memilih untuk mengautentikasi, browser mereka menunjukkan kepada mereka pilihan alamat email ("pribadi", "pekerjaan", "aktivisme politik", dll.) Yang dapat mereka gunakan untuk mengidentifikasi diri mereka ke situs.
  16. Manfaat antarmuka pengguna besar lainnya yang dicari sebagai bagian dari upaya ini adalah membantu browser mengetahui lebih banyak tentang sesi pengguna - yang mereka masuki saat ini, terutama - sehingga dapat menampilkannya di browser chrome.
  17. Karena sifat terdistribusi dari sistem ini, ia menghindari penguncian ke situs-situs utama seperti Facebook, Twitter, Google, dll. Setiap individu dapat memiliki domain sendiri dan karenanya bertindak sebagai penyedia identitas mereka sendiri.

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.

Charlie
sumber
3
Tautan BrowserID sudah mati
Mehdi Bounya
Proyek ini tampaknya telah dibuat mothballed .... lihat en.wikipedia.org/wiki/Mozilla_Persona
Jeff Olson
138

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:

<input type="text" name="email" style="display:none" />

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 inputbidang menggunakan CSS atau JavaScript / jQuery - apa pun yang paling cocok untuk Anda - hanya jangan atur input typeke hiddenatau 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 textdan namanya email(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 dari 0karakter.

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:nonediterapkan 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!

Pieter888
sumber
33
Ini adalah trik anti-spam yang berguna, tetapi saya sarankan menggunakan nama bidang selain 'email', atau Anda mungkin menemukan bahwa isi-otomatis peramban mengisinya, secara tidak sengaja memblokir pengguna asli situs Anda.
Nico Burns
8
Saya juga memiliki beberapa dari ini menggunakan visibility:hiddendan juga position:absolute;top:-9000pxAnda juga dapat melakukan text-indentdan juga z-indexpada 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
TheBlackBenzKid
18
Apa yang terjadi ketika pengguna dengan gangguan penglihatan menggunakan screenreader untuk menavigasi formulir?
soycharliente
8
Teknik ini memiliki nama: the honeypot en.wikipedia.org/wiki/Honeypot_(computing)
pixeline
27
Tidak perlu styling inline. Cukup tambahkan kelas ke bidang (mungkin menggunakan kata aneh yang tidak pernah bisa berarti apa pun untuk bot), dan sembunyikan melalui file CSS situs. Seperti: <input type="text" name="email" class="cucaracha">dan di CSS Anda: .cucaracha { display:none; }.
Ricardo Zea
81

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

  • Masalahnya lebih terletak pada pengaturan akun daripada pengecekan kata sandi.
  • Penggunaan otentikasi dua faktor jauh lebih aman daripada cara enkripsi kata sandi yang lebih pintar
  • 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.)

    1. Digest Authentication adalah pendekatan berbasis standar yang didukung di semua browser dan server utama, yang tidak akan mengirim kata sandi bahkan melalui saluran yang aman.

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.

  1. 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 )

  2. 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"

  3. 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...

Anda cad sir - ambil itu
sumber
29
Sulit untuk mengatakan jawaban mana yang Anda bicarakan di 'Saya tidak berpikir jawaban di atas adalah "salah"'
Davorak
55

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 +)

josh
sumber
5
SHA-512 juga cepat, jadi Anda perlu ribuan iterasi.
Seun Osewa
5
"jangan gunakan algoritma hash cepat ... hash lebih lambat lebih baik" - Penjelasan? Dokumentasi?
one.beat.consumer
17
Penjelasan: 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 forcing menjadi tidak praktis untuk kata sandi yang lebih panjang (8 digit +)
NickG
6
Lebih mirip sesuatu seperti bcrypt yang dirancang untuk hash perlahan.
Fabian Nicollier
4
Seperti yang disebutkan dalam jawaban lain, "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." MD5 atau fungsi hashing SHA tidak boleh digunakan untuk hashing password. Jawaban ini adalah saran yang buruk.
Mike
51

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

blade19899
sumber
25

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.

Iain Duncan
sumber
Tautan sederhana dalam email sebenarnya tidak aman, karena email tidak aman.
David Spector
Ini aman seperti sistem reset kata sandi berbasis token lainnya yang bukan dua faktor. Yang hampir semuanya.
Iain Duncan
17

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

pengguna9869932
sumber
14

Saya ingin menambahkan satu komentar yang sangat penting: -

  • "Dalam perusahaan, intra pengaturan bersih," kebanyakan jika tidak semua hal tersebut mungkin tidak berlaku!

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."

Mike Robinson
sumber
9
Apakah Anda jatuh dalam tanda baca dengan baik sebagai seorang anak? :) Saya sudah membacanya tiga kali dan saya masih bingung pada titik apa yang Anda coba buat. Tetapi jika Anda mengatakan "Kadang-kadang Anda tidak perlu otentikasi berbasis formulir" maka Anda benar. Tetapi mengingat kita sedang mendiskusikan kapan kita membutuhkannya, aku tidak mengerti mengapa ini sangat penting untuk dicatat?
Hugo Delsing
1
Maksud saya adalah dunia di luar korporasi sama sekali berbeda dari dunia di dalamnya. Jika Anda membuat aplikasi yang dapat diakses oleh "web berbatu lebar", dan untuk konsumsi umum, maka Anda tidak punya pilihan selain memutar metode otentikasi dan otorisasi Anda sendiri. Tetapi, di dalam sebuah perusahaan, di mana satu-satunya cara untuk sampai ke sana adalah berada di sana atau menggunakan VPN, maka sangat mungkin bahwa aplikasi tersebut tidak akan memiliki - tidak harus memiliki - metode "sendiri" untuk melakukan hal-hal ini. Aplikasi harus menggunakan metode ini sebagai gantinya, untuk menyediakan manajemen yang konsisten dan terpusat.
Mike Robinson
2
Bahkan intranet membutuhkan jumlah minimum keamanan di gedung. Penjualan memiliki angka untung dan rugi rahasia, sementara teknik memiliki kekayaan intelektual rahasia. Banyak perusahaan membatasi data lintas departemen atau divisi.
Sablefoste