Panduan definitif untuk membentuk berbasis web otentikasi

Bentuk otentikasi berbasis website

Kami percaya bahwa Stack Overflow seharusnya tidak hanya menjadi sumber daya yang sangat spesifik pertanyaan teknis, tetapi juga untuk pedoman umum tentang cara untuk memecahkan variasi pada masalah-masalah umum. "otentikasi berbasis Form untuk website" harus baik-baik saja topik untuk percobaan tersebut.

Ini harus mencakup topik-topik seperti:

  • Bagaimana untuk log in
  • Cara log out
  • Bagaimana untuk tetap masuk
  • Mengelola cookie (termasuk pengaturan yang direkomendasikan)
  • SSL/HTTPS enkripsi
  • Bagaimana untuk menyimpan password
  • Menggunakan pertanyaan rahasia
  • Lupa username/password fungsi
  • Penggunaan nonces untuk mencegah cross-site request pemalsuan (CSRF)](https://en.wikipedia.org/wiki/Cross-site_request_forgery)
  • OpenID
  • "Ingat saya" centang
  • Browser pelengkapan otomatis username dan password
  • Url rahasia (umum URL dilindungi oleh digest)
  • Memeriksa kekuatan password
  • E-mail validasi
  • dan banyak lagi tentang otentikasi berbasis form...

Ini tidak harus mencakup hal-hal seperti:

  • Peran dan otorisasi
  • HTTP otentikasi dasar

Mohon bantu kami dengan:

  1. Menunjukkan keindahannya.
  2. Mengirimkan artikel yang baik tentang subjek ini
  3. Mengedit jawaban resmi
Mengomentari pertanyaan (17)
Larutan

BAGIAN I: Bagaimana Untuk Log In ##

Kami'll asumsikan anda sudah tahu bagaimana membangun sebuah login+password form HTML yang Posting nilai script pada sisi server untuk otentikasi. Bagian di bawah ini akan bergerak dengan pola suara praktis auth, dan bagaimana untuk menghindari yang paling umum keamanan perangkap. Untuk HTTPS atau tidak ke HTTPS? Kecuali jika koneksi sudah aman (yaitu, terowongan melalui HTTPS menggunakan SSL/TLS), anda login form nilai-nilai yang akan dikirim di cleartext, yang memungkinkan siapa pun menguping pada garis antara browser dan web server akan dapat membaca login sebagai mereka melewati. Jenis penyadapan ini dilakukan secara rutin oleh pemerintah, tapi secara umum, kami tidak't alamat 'dimiliki' kabel lain untuk mengatakan ini: Hanya menggunakan HTTPS. Pada dasarnya, satu-satunya praktis cara untuk melindungi terhadap penyadapan/packet sniffing pada saat login dengan menggunakan HTTPS atau sertifikat lain yang berbasis skema enkripsi (misalnya, [TLS][1]) atau terbukti & diuji tantangan-respon skema (misalnya, [Diffie-Hellman][2] berbasis SRP). Metode lainnya dapat dengan mudah dielakkan oleh menguping penyerang. Tentu saja, jika anda bersedia untuk mendapatkan sedikit tidak praktis, anda juga bisa mempekerjakan beberapa bentuk otentikasi dua faktor skema (misalnya aplikasi Google Authenticator, fisik 'perang dingin gaya' codebook, atau RSA key generator dongle). Jika diterapkan dengan benar, ini bisa bekerja bahkan dengan sambungan yang tidak aman, tapi itu's sulit untuk membayangkan bahwa dev akan bersedia untuk melaksanakan two-factor auth tapi tidak SSL. (Tidak) Roll-anda-sendiri JavaScript enkripsi/hashing Mengingat dirasakan (meskipun sekarang [dihindari][27]) biaya dan kesulitan teknis mendirikan sebuah sertifikat SSL di situs web anda, beberapa pengembang tergoda untuk menggulung mereka sendiri di-browser hashing atau skema enkripsi dalam rangka untuk menghindari melewati cleartext login lebih dari satu tanpa jaminan kawat. Saat ini adalah yang mulia berpikir, itu pada dasarnya tidak berguna (dan bisa menjadi [keamanan][3]), kecuali jika hal ini dikombinasikan dengan salah satu kode di atas - bahwa, baik mengamankan garis dengan enkripsi yang kuat atau menggunakan mencoba-dan-diuji tantangan-respon mekanisme (jika anda don't tahu apa itu, hanya tahu bahwa itu adalah salah satu yang paling sulit untuk membuktikan, paling sulit untuk desain, dan paling sulit untuk menerapkan konsep-konsep dalam keamanan digital). Sementara memang benar bahwa hashing password dapat efektif terhadap password pengungkapan, itu adalah rentan terhadap serangan replay, Man-In-The-Middle serangan / pembajakan (jika penyerang dapat menyuntikkan beberapa byte ke anda tanpa jaminan halaman HTML sebelum mencapai browser anda, mereka hanya dapat komentar hashing dalam JavaScript), atau serangan brute force (karena anda menyerahkan penyerang kedua username, garam dan hash password). CAPTCHA terhadap kemanusiaan [CAPTCHA][4] dimaksudkan untuk menggagalkan salah satu kategori tertentu dari serangan: otomatis kamus/brute force trial-and-error tanpa operator manusia. Tidak ada keraguan bahwa ini adalah ancaman nyata, namun, ada cara untuk mengatasinya mulus bahwa don't memerlukan CAPTCHA, secara khusus dirancang dengan baik server-side login throttling skema - kita'll membahas mereka nanti. Tahu bahwa CAPTCHA implementasi tidak diciptakan sama; mereka sering aren't-manusia dipecahkan, sebagian besar dari mereka yang benar-benar efektif melawan bots, semua dari mereka adalah tidak efektif terhadap ketiga murah-dunia kerja (menurut [OWASP][5], saat ini sweatshop tukar adalah $12 per 500 tes), dan beberapa implementasi mungkin secara teknis ilegal di beberapa negara (lihat [OWASP Otentikasi Contekan][6]). Jika anda harus menggunakan CAPTCHA, gunakan Google's [reCAPTCHA][7], karena itu adalah OCR-keras dengan definisi (karena sudah menggunakan OCR-kesalahan klasifikasi buku scan) dan berusaha terlalu keras untuk menjadi user-friendly. Secara pribadi, saya cenderung untuk menemukan CAPTCHA mengganggu, dan menggunakannya hanya sebagai pilihan terakhir ketika pengguna telah gagal untuk log in beberapa kali dan throttling penundaan maxed out. Ini akan terjadi cukup jarang untuk dapat diterima, dan memperkuat sistem secara keseluruhan. Menyimpan Password / Verifikasi login Ini mungkin akhirnya menjadi pengetahuan umum setelah semua yang sangat-dipublikasikan hacks dan pengguna kebocoran data kami've terlihat dalam beberapa tahun terakhir, tapi itu harus dikatakan: Jangan menyimpan password di cleartext dalam database anda. Pengguna basis data secara rutin hacked, bocor atau diperoleh melalui SQL injection, dan jika anda menyimpan baku, plaintext password, yang instan permainan atas untuk anda login keamanan. Jadi jika anda bisa't toko sandi, bagaimana anda memeriksa bahwa login+password kombinasi yang Dikirim dari form login yang benar? Jawabannya adalah hashing menggunakan [key derivasi fungsi][24]. Setiap kali user baru dibuat atau password berubah, anda mengambil kata sandi dan menjalankannya melalui KDF, seperti Argon2, bcrypt, scrypt atau PBKDF2, mengubah cleartext password ("correcthorsebatterystaple") menjadi panjang, acak-mencari string, yang jauh lebih aman untuk menyimpan dalam database anda. Untuk memverifikasi login, anda menjalankan fungsi hash yang sama pada password yang dimasukkan, kali ini lewat di garam dan membandingkan hash yang dihasilkan string untuk nilai yang disimpan dalam database anda. Argon2, bcrypt dan scrypt menyimpan garam dengan hash sudah. Check out ini [artikel][23] pada sec.stackexchange untuk informasi lebih rinci. Alasan yang digunakan adalah bahwa hashing sendiri adalah tidak cukup-anda'll ingin menambahkan disebut 'garam' untuk melindungi hash terhadap [rainbow tabel][8]. Garam efektif mencegah dua password yang sama persis dari yang disimpan sebagai nilai hash yang sama, mencegah seluruh database yang di-scan dalam satu run jika penyerang mengeksekusi menebak password serangan. Kriptografi hash tidak boleh digunakan untuk penyimpanan password karena dipilih pengguna password tidak cukup kuat (yaitu biasanya tidak mengandung cukup entropi) dan password menebak serangan bisa diselesaikan dalam waktu yang relatif singkat dengan seorang penyerang dengan akses ke hash. Ini adalah mengapa KDFs yang digunakan - ini efektif ["meregangkan kunci"][25], yang berarti bahwa setiap menebak sandi penyerang membuat menyebabkan beberapa pengulangan dari algoritma hash, misalnya 10.000 kali, yang menyebabkan penyerang untuk menebak password 10.000 kali lebih lambat. Sesi data - "Anda login sebagai Spiderman69" Setelah server sudah terverifikasi login dan password terhadap user database dan menemukan kecocokan, sistem tersebut membutuhkan cara untuk mengingat bahwa browser telah dikonfirmasi. Fakta ini seharusnya hanya disimpan di sisi server di data sesi.

Jika anda tidak terbiasa dengan data sesi, di sini's cara kerjanya: satu secara acak string disimpan dalam aplikasi yang berakhir cookie dan digunakan untuk referensi koleksi dari data - data sesi yang disimpan di server. Jika anda menggunakan MVC framework, ini tidak diragukan lagi sudah ditangani. Jika memungkinkan, pastikan sesi cookie telah aman dan HTTP-Satunya bendera yang ditetapkan ketika dikirim ke browser. The flag HttpOnly menyediakan beberapa perlindungan terhadap cookie yang sedang dibaca melalui serangan XSS. Bendera aman memastikan bahwa cookie hanya dikirim kembali melalui HTTPS, dan karena itu melindungi terhadap jaringan mengendus serangan. Nilai cookie tidak bisa diprediksi. Di mana cookie referensi non-ada sesi disajikan, nilainya harus segera diganti untuk mencegah sesi fiksasi.

BAGIAN II: Bagaimana Untuk Tetap Masuk - Terkenal "Ingat Saya" Centang ##

Login Persistent Cookies ("ingat saya" fungsi) adalah zona bahaya; di satu sisi, mereka sepenuhnya aman seperti konvensional login ketika pengguna memahami bagaimana untuk menangani mereka; dan di sisi lain, mereka adalah besar risiko keamanan di tangan pengguna ceroboh, siapa yang dapat menggunakannya pada komputer umum dan lupa untuk log out, dan yang mungkin tidak tahu apa cookie browser atau bagaimana untuk menghapusnya. Secara pribadi, saya suka gigih login untuk situs-situs yang saya kunjungi secara teratur, tapi aku tahu bagaimana untuk menangani mereka dengan aman. Jika anda yakin bahwa anda tahu pengguna yang sama, anda dapat menggunakan login persisten dengan hati nurani yang bersih. Jika tidak baik, maka anda dapat berlangganan filosofi bahwa pengguna yang ceroboh dengan login mereka membawa pada diri mereka sendiri jika mereka mendapatkan hacked. It's tidak seperti yang kita pergi untuk pengguna kami's rumah dan merobek semua orang facepalm-merangsang Post-It notes dengan password mereka telah berbaris di tepi monitor mereka, baik. Tentu saja, beberapa sistem dapat't mampu untuk memiliki setiap account hacked; untuk sistem seperti ini, tidak ada cara anda dapat benar-benar memiliki login persisten. Jika anda memutuskan untuk menerapkan login persistent cookies, ini adalah bagaimana anda melakukannya:

  1. Pertama, luangkan waktu untuk baca Paragon Inisiatif's artikel pada subjek. Anda'll perlu untuk mendapatkan sekelompok elemen yang tepat, dan artikel melakukan pekerjaan yang besar untuk menjelaskan masing-masing.
  2. Dan, hanya untuk menekankan salah satu yang paling umum jebakan, JANGAN MENYIMPAN PERSISTENT COOKIE LOGIN (TOKEN) DI DATABASE ANDA, HANYA HASH DARI ITU! Login token adalah Password yang Setara, sehingga jika penyerang mendapat tangan mereka pada database anda, mereka bisa menggunakan token untuk login ke account apapun, hanya seolah-olah mereka cleartext login-kombinasi password. Oleh karena itu, menggunakan hashing (menurut https://security.stackexchange.com/a/63438/5002 lemah hash akan baik-baik saja untuk tujuan ini) ketika menyimpan gigih login token.

    BAGIAN III: Menggunakan Pertanyaan Rahasia

    Don't menerapkan 'pertanyaan rahasia'. The 'pertanyaan rahasia' fitur keamanan anti-pola. Baca kertas dari link nomor 4 dari WAJIB daftar. Anda dapat meminta Sarah Palin tentang yang satu itu, setelah Yahoo! akun email yang diretas selama presiden sebelumnya kampanye karena jawaban pertanyaan keamanan adalah... "Wasilla Sma"! Bahkan dengan yang ditentukan pengguna pertanyaan, hal ini sangat mungkin bahwa sebagian besar pengguna akan memilih:

  • A 's' pertanyaan rahasia seperti ibu's nama gadis atau hewan peliharaan favorit
  • Sepotong sederhana dari hal-hal sepele yang siapa pun bisa angkat dari blog mereka, profil LinkedIn, atau serupa
  • Setiap pertanyaan yang mudah untuk menjawab daripada menebak password mereka. Yang mana, untuk setiap password, setiap pertanyaan yang dapat anda bayangkan Kesimpulannya, pertanyaan keamanan yang secara inheren tidak aman di hampir semua bentuk dan variasi, dan tidak boleh digunakan dalam skema otentikasi untuk alasan apapun. Alasan yang benar mengapa pertanyaan keamanan bahkan ada di alam liar adalah bahwa mereka mudah menghemat biaya dari beberapa dukungan panggilan dari pengguna yang dapat't mengakses email mereka untuk mendapatkan reaktivasi kode. Ini dengan mengorbankan keamanan dan Sarah Palin's reputasi. Layak? Mungkin tidak.

    BAGIAN IV: Lupa Password Fungsi ##

    Saya sudah sebutkan mengapa anda harus jangan pernah menggunakan pertanyaan keamanan untuk penanganan lupa/hilang password pengguna; hal ini juga berjalan tanpa mengatakan bahwa anda harus tidak pernah e-mail pengguna mereka password yang sebenarnya. Setidaknya ada dua lagi yang terlalu umum untuk menghindari perangkap di bidang ini:

  1. Don't reset lupa password untuk aplikasi software otomatis password yang kuat - seperti password yang terkenal sulit untuk mengingat, yang berarti pengguna harus mengubah atau menuliskannya - mengatakan, pada kuning cerah Post-It di tepi monitor mereka. Bukan menetapkan password baru, biarkan pengguna memilih yang baru langsung - yang adalah apa yang mereka ingin lakukan pula. (Pengecualian untuk ini mungkin jika pengguna universal menggunakan password manager untuk menyimpan/mengelola password yang biasanya tidak mungkin untuk mengingat tanpa menuliskannya).
  2. Selalu hash password lupa kode/token dalam database. LAGI, kode ini adalah contoh lain dari sebuah Password yang Setara, sehingga HARUS dirinci dalam kasus penyerang mendapat tangan mereka pada database anda. Ketika lupa password kode yang diminta, kirim plaintext kode untuk pengguna's alamat email, maka hash itu, menyimpan hash dalam database anda-dan membuang asli. Sama seperti password atau terus-menerus login token. Akhir catatan: selalu pastikan anda antarmuka untuk memasukkan 'lupa password kode' setidaknya aman seperti anda login form itu sendiri, atau penyerang hanya akan menggunakan ini untuk mendapatkan akses sebaliknya. Pastikan anda menghasilkan sangat panjang 'lupa password kode' (misalnya, 16 case-sensitive karakter alfanumerik) adalah awal yang baik, tapi pertimbangkan untuk menambahkan yang sama throttling skema yang anda lakukan untuk form login itu sendiri.

    BAGIAN V: Memeriksa Kekuatan Password ##

    Pertama, anda'll ingin membaca artikel kecil ini untuk reality check: 500 paling umum password Oke, jadi mungkin daftar isn't kanonik daftar password yang paling umum pada setiap sistem di mana saja yang pernah, tapi itu's indikasi yang baik tentang bagaimana buruk orang-orang akan memilih password mereka ketika tidak diberlakukan kebijakan di tempat. Plus, daftar terlihat menakutkan dekat dengan rumah ketika anda membandingkannya dengan yang tersedia secara publik analisis baru-baru ini mencuri password. Jadi: tidak ada minimum password persyaratan kekuatan, 2% dari pengguna menggunakan salah satu dari top 20 password yang paling umum. Artinya: jika seorang penyerang mendapatkan hanya 20 kali, 1 dalam 50 account pada website anda akan crackable. Menggagalkan hal ini memerlukan perhitungan entropi password dan kemudian menerapkan ambang batas. Institut Nasional Standar dan Teknologi (NIST) Khusus Publikasi 800-63 memiliki satu set yang sangat baik saran. Yang, bila dikombinasikan dengan kamus dan tata letak keyboard analisis (misalnya, 'qwertyuiop' adalah password yang buruk), dapat menolak 99% dari semua dipilih buruk password pada tingkat 18 bit entropi. Hanya menghitung kekuatan password dan menunjukkan kekuatan visual meter untuk pengguna yang lebih baik, tapi tidak cukup. Kecuali itu diberlakukan, banyak pengguna kemungkinan besar akan mengabaikan hal itu. Dan untuk menyegarkan mengambil pengguna-keramahan dari tinggi entropi password, Randall Munroe's Kekuatan Password xkcd ini sangat dianjurkan. Memanfaatkan Troy Hunt's aku Telah Pwned API untuk memeriksa pengguna password terhadap password dikompromikan di semua pelanggaran data.

    BAGIAN VI: Lebih - Atau: Mencegah Cepat-Api Mencoba Login ##

    Pertama, kita lihat angka-angka: Password Recovery Kecepatan - Berapa lama akan anda password stand up Jika anda don't memiliki waktu untuk melihat melalui tabel di link itu, di sini's daftar mereka:

  3. Dibutuhkan hampir tidak ada waktu untuk crack password yang lemah, bahkan jika anda're retak itu dengan sempoa
  4. Dibutuhkan hampir tidak ada waktu untuk memecahkan alfanumerik 9-karakter kata sandi jika itu adalah case sensitive
  5. Dibutuhkan hampir tidak ada waktu untuk retak yang rumit, simbol-simbol-dan-huruf-dan-angka-angka, huruf besar dan huruf kecil sandi jika itu adalah kurang dari 8 karakter (desktop PC dapat mencari seluruh keyspace hingga 7 karakter dalam hitungan hari atau bahkan jam)
  6. Namun, hal itu memakan banyak waktu untuk retak bahkan 6 karakter password, jika anda terbatas pada satu usaha per detik! Jadi apa yang dapat kita pelajari dari angka-angka ini? Nah, banyak, tapi kita bisa fokus pada bagian yang paling penting: fakta bahwa mencegah sejumlah besar cepat-api berturut-turut mencoba login (ie. yang brute force serangan) benar-benar isn't yang sulit. Tapi mencegah kanan isn't semudah tampaknya. Secara umum, anda memiliki tiga pilihan yang efektif terhadap serangan brute-force (dan serangan kamus, tapi karena anda sudah menggunakan password yang kuat kebijakan, seharusnya mereka't menjadi masalah):
  • Sekarang CAPTCHA setelah N kali gagal (menyebalkan dan sering tidak efektif -- tapi aku'm mengulang sendiri di sini)
  • Mengunci akun dan memerlukan verifikasi email setelah N kali gagal (ini adalah DoS serangan yang menunggu untuk terjadi)
  • Dan akhirnya, login throttling: yang, pengaturan waktu tunda antara upaya setelah N kali gagal (ya, serangan DoS masih mungkin, tapi setidaknya mereka jauh lebih besar dan jauh lebih rumit untuk menarik off). Best practice #1: singkat waktu tunda yang meningkat dengan jumlah yang gagal, seperti:
  • 1 gagal = tidak ada delay
  • 2 yang gagal = 2 detik delay
  • 3 yang gagal = 4 detik delay
  • 4 usaha yang gagal = 8 detik delay
  • 5 kali gagal = 16 detik delay
  • dll. DoS menyerang skema ini akan sangat tidak praktis, karena dihasilkan lockout waktu sedikit lebih besar dari jumlah sebelumnya lockout kali. Untuk memperjelas: penundaan adalah tidak penundaan sebelum kembali respon ke browser. Hal ini lebih seperti sebuah batas waktu atau periode refrakter selama yang mencoba login ke akun tertentu atau dari alamat IP tertentu tidak akan diterima atau dievaluasi pada semua. Artinya, kredensial yang benar tidak akan kembali sukses login, dan mandat yang salah tidak akan memicu peningkatan penundaan. Best practice #2: menengah panjang waktu tunda yang berlaku setelah N kali gagal, seperti:
  • 1-4 gagal = tidak ada delay
  • 5 kali gagal = 15-30 menit delay DoS menyerang skema ini akan cukup praktis, tapi pasti bisa dilakukan. Juga, itu mungkin relevan untuk dicatat bahwa seperti penundaan yang lama dapat sangat mengganggu untuk pengguna yang sah. Pelupa pengguna akan menyukai anda. Best practice #3: Menggabungkan dua pendekatan, baik tetap, penundaan waktu singkat yang masuk ke efek setelah N kali gagal, seperti:
  • 1-4 gagal = tidak ada delay
  • 5+ gagal = 20 detik delay Atau, peningkatan keterlambatan dengan tetap terikat atas, seperti:
  • 1 gagal = 5 detik delay
  • 2 yang gagal = 15 detik delay
  • 3+ gagal = 45 detik delay Tugas akhir ini skema diambil dari OWASP praktek-praktek terbaik saran (link 1 dari HARUS-MEMBACA daftar) dan harus dianggap sebagai praktek terbaik, bahkan jika itu adalah diakui pada sisi pencekalan. Sebagai aturan praktis, namun, saya akan mengatakan: kuat password anda kebijakan ini, semakin sedikit anda harus bug pengguna dengan penundaan. Jika anda memerlukan kuat (case-sensitive alphanumerics + diperlukan angka-angka dan simbol-simbol) 9+ karakter password, anda bisa memberikan pengguna 2-4 non-tertunda upaya password sebelum mengaktifkan throttling. DoS menyerang akhir ini login throttling skema akan menjadi sangat tidak praktis. Dan sebagai sentuhan akhir, selalu memungkinkan persisten (cookie) login (dan/atau CAPTCHA-verified form login) untuk melewati, sehingga pengguna yang sah tidak't bahkan menjadi tertunda sementara serangan yang sedang berlangsung. Dengan cara itu, sangat tidak praktis serangan DoS menjadi sangat praktis serangan. Selain itu, masuk akal untuk melakukan lebih agresif throttling pada rekening admin, karena mereka adalah yang paling menarik entri poin

    BAGIAN VII: Didistribusikan Serangan Brute Force ##

    Sekedar tambahan, lebih maju penyerang akan mencoba untuk menghindari login throttling oleh 'menyebarkan kegiatan mereka':

  • Mendistribusikan upaya pada sebuah botnet untuk mencegah alamat IP lesu
  • Daripada memilih salah satu pengguna dan mencoba 50.000 paling umum password (yang mereka dapat't, karena kami throttling), mereka akan memilih YANG paling umum password dan mencoba melawan 50.000 pengguna, bukan. Dengan cara itu, mereka tidak hanya mendapatkan sekitar maksimum-upaya langkah-langkah seperti Captcha dan login throttling, kesempatan untuk sukses akan meningkat juga, karena jumlah 1 password yang paling umum adalah jauh lebih besar dari jumlah 49.995
  • Jarak login permintaan untuk masing-masing akun pengguna, mengatakan, 30 detik terpisah, untuk menyelinap di bawah radar Di sini, praktek terbaik akan menjadi penebangan jumlah gagal login, sistem-lebar, dan menggunakan rata-rata berjalan dari situs anda's buruk-login frekuensi sebagai dasar untuk batas atas yang kemudian memaksakan pada semua pengguna. Terlalu abstrak? Mari saya ulangi: Mengatakan situs anda telah memiliki rata-rata 120 buruk login per hari selama 3 bulan. Menggunakan itu (berjalan rata-rata), sistem anda dapat mengatur batas global untuk 3 kali itu -- yaitu. 360 gagal selama periode 24 jam. Kemudian, jika jumlah total dari gagal di semua rekening melebihi jumlah dalam satu hari (atau bahkan lebih baik, monitor tingkat percepatan dan memicu pada dihitung ambang batas), hal ini akan mengaktifkan seluruh sistem login throttling - arti penundaan singkat untuk SEMUA pengguna (masih, dengan pengecualian dari cookie login dan/atau cadangan CAPTCHA login). Saya juga memposting pertanyaan dengan lebih detail dan benar-benar diskusi yang baik tentang bagaimana untuk menghindari rumit pitfals dalam menangkis didistribusikan serangan brute force

    BAGIAN VIII: Dua-Faktor Otentikasi dan Penyedia Otentikasi ##

    Kredensial dapat dikompromikan, baik oleh eksploitasi, password yang dituliskan dan hilang, laptop dengan tombol yang dicuri, atau pengguna memasukkan login ke situs phishing. Login dapat lebih dilindungi dengan otentikasi dua faktor, yang menggunakan out-of-band faktor-faktor seperti single-gunakan kode yang diterima dari panggilan telepon, pesan SMS, aplikasi, atau dongle. Beberapa penyedia menawarkan dua-faktor otentikasi jasa. Otentikasi dapat benar-benar dilimpahkan ke single-sign-on layanan, di mana operator lain menangani mengumpulkan kredensial. Hal ini mendorong masalah ini ke pihak ketiga yang terpercaya. Google dan Twitter keduanya memberikan standar SSO berbasis jasa, sementara Facebook menyediakan sebuah paten sejenis solusi.

    WAJIB BACA LINK Tentang Web Authentication ##

  1. OWASP Panduan Untuk Otentikasi / OWASP Otentikasi Contekan
  2. Dos dan Tidak boleh dilakukan Otentikasi Klien di Web (sangat mudah dibaca MIT makalah penelitian)
  3. Wikipedia: HTTP cookie
  4. Pengetahuan pribadi pertanyaan untuk mundur otentikasi: pertanyaan Keamanan di era Facebook (sangat mudah dibaca Berkeley research paper)
Komentar (70)

Artikel Definitif

Mengirim kredensial

Satu-satunya cara praktis untuk mengirim kredensial 100% aman adalah dengan menggunakan SSL. Menggunakan JavaScript untuk hash password tidak aman. Perangkap umum untuk klien-sisi hashing password:

  • Jika koneksi antara client dan server yang tidak terenkripsi, segala sesuatu yang anda lakukan adalah rentan terhadap man-in-the-middle serangan. Seorang penyerang dapat mengganti masuk javascript untuk memecahkan hashing atau mengirim semua informasi ke server mereka, mereka bisa mendengarkan respon klien dan meniru pengguna yang sempurna, dll. dll. SSL dengan Otoritas Sertifikat terpercaya dirancang untuk mencegah serangan MitM.
  • Password hash yang diterima oleh server adalah kurang aman jika anda don't melakukan tambahan, kerja berlebihan pada server. Ada's lain yang aman metode yang disebut SRP, tapi itu's dipatenkan (meskipun berlisensi bebas) dan ada beberapa implementasi yang tersedia.

    Menyimpan password

    Don't pernah menyimpan password sebagai plaintext dalam database. Bahkan jika anda don't peduli tentang keamanan dari situs anda sendiri. Asumsikan bahwa beberapa dari anda pengguna akan menggunakan kembali password dari akun bank online. Jadi, menyimpan hash password, dan membuang asli. Dan pastikan password doesn't muncul di log akses atau aplikasi log. OWASP menganjurkan penggunaan Argon2 sebagai pilihan pertama untuk aplikasi baru. Jika ini tidak tersedia, PBKDF2 atau scrypt harus digunakan sebagai gantinya. Dan akhirnya jika di atas tidak tersedia, gunakan bcrypt. Hash sendiri juga tidak aman. Misalnya, identik password berarti identik hash--ini membuat hash tabel lookup cara yang efektif retak banyak password sama sekali. Sebaliknya, menyimpan asin hash. Garam adalah string yang ditambahkan ke password sebelum hashing - penggunaan yang berbeda (random) garam per pengguna. Garam adalah semua nilai, sehingga anda dapat menyimpannya dengan hash dalam database. Lihat di sini untuk lebih lanjut tentang ini. Ini berarti bahwa anda dapat't mengirim pengguna yang lupa password (karena anda hanya memiliki hash). Don't reset user's password kecuali jika anda memiliki authenticated user (pengguna harus membuktikan bahwa mereka mampu untuk membaca email yang dikirim untuk disimpan (dan divalidasi) alamat email.)

    Pertanyaan keamanan

    Pertanyaan keamanan yang tidak aman - menghindari menggunakan mereka. Mengapa? Apa pun pertanyaan keamanan tidak, password tidak baik. Baca BAGIAN III: Menggunakan Pertanyaan Rahasia di @Jens Roland jawaban di sini di wiki ini.

    Sesi cookie

    Setelah pengguna log in, server akan mengirimkan pengguna sesi cookie. Server dapat mengambil username atau id dari cookie, tapi tak ada lagi yang bisa menghasilkan seperti cookie (TODO menjelaskan mekanisme). Cookies dapat dibajak: mereka hanya sebagai aman sebagai sisa dari klien's mesin dan komunikasi lainnya. Mereka dapat dibaca dari disk, mendengus lalu lintas jaringan, diangkat oleh cross-site scripting serangan, terkena phising dari diracuni DNS sehingga klien mengirimkan cookie mereka ke salah server. Don't mengirimkan cookie. Cookie harus berakhir di akhir sesi klien (browser dekat atau meninggalkan domain anda). Jika anda ingin autologin pengguna anda, anda dapat mengatur cookie persisten, tetapi harus berbeda dari penuh-sesi cookie. Anda dapat mengatur bendera tambahan bahwa pengguna memiliki auto-login, dan kebutuhan untuk log-in real untuk operasi sensitif. Ini adalah populer dengan situs belanja yang ingin untuk menyediakan anda dengan mulus, personalisasi pengalaman belanja tapi masih melindungi rincian keuangan anda. Misalnya, ketika anda kembali untuk mengunjungi Amazon, mereka menunjukkan sebuah halaman yang terlihat seperti anda're login, tapi ketika anda pergi ke tempat order (atau perubahan alamat pengiriman anda, kartu kredit dll.), mereka meminta anda untuk mengkonfirmasi password anda. Situs keuangan seperti bank dan kartu kredit, di sisi lain, hanya memiliki data sensitif dan tidak harus memungkinkan auto-login atau rendah-modus keamanan.

    Daftar dari sumber daya eksternal

Komentar (5)

Pertama, yang kuat peringatan bahwa jawaban ini tidak cocok untuk ini pertanyaan yang tepat. Itu pasti tidak boleh atas jawabannya!

Aku akan pergi ke depan dan menyebutkan Mozilla diusulkan BrowserID (atau mungkin lebih tepatnya, Verified Protokol Email) dalam semangat mencari jalur upgrade untuk pendekatan yang lebih baik untuk otentikasi di masa depan.

Saya akan meringkas cara ini:

  1. Mozilla adalah organisasi nirlaba dengan nilai yang menyelaraskan dengan baik dengan mencari solusi yang baik untuk masalah ini.
  2. Realitas saat ini adalah bahwa kebanyakan website menggunakan otentikasi berbasis bentuk
  3. Bentuk otentikasi berbasis memiliki kelemahan besar, yaitu peningkatan risiko phishing. Pengguna diminta untuk memasukkan informasi sensitif ke daerah yang dikontrol oleh remote badan, daripada daerah yang dikontrol oleh User Agent (browser).
  4. Karena browser yang dipercaya secara implisit (seluruh ide dari User Agen untuk bertindak atas nama Pengguna), mereka dapat membantu memperbaiki situasi ini.
  5. Kekuatan utama menahan kemajuan di sini adalah penyebaran kebuntuan. Solusi yang harus diuraikan menjadi langkah-langkah yang memberikan beberapa keuntungan tambahan pada mereka sendiri.
  6. Yang paling sederhana desentralisasi metode untuk mengekspresikan identitas yang dibangun ke dalam infrastruktur internet adalah nama domain.
  7. Sebagai tingkat kedua mengekspresikan identitas, masing-masing domain mengelola sendiri akun.
  8. Bentuk "akun@domain" adalah ringkas dan didukung oleh berbagai protokol dan skema URI. Seperti sebuah identifier adalah, tentu saja, yang paling diakui secara universal sebagai alamat email.
  9. Penyedia Email yang sudah de-facto utama penyedia identitas online. Saat ini, reset password mengalir biasanya membiarkan anda mengambil kendali dari sebuah akun jika anda dapat membuktikan bahwa anda mengontrol akun yang terkait dengan alamat email.
  10. Verified Email Protokol yang diusulkan untuk memberikan metode yang aman, yang didasarkan pada kriptografi kunci publik, untuk memperlancar proses pembuktian untuk domain B yang memiliki akun di domain A.
  11. Untuk browser yang tidak mendukung Email Terverifikasi Protocol (saat ini semua dari mereka), Mozilla menyediakan shim yang mengimplementasikan protokol client-side JavaScript code.
  12. Untuk layanan email yang tidak mendukung Email Terverifikasi Protocol, protokol yang memungkinkan pihak ketiga untuk bertindak sebagai perantara yang terpercaya, menyatakan bahwa mereka telah memverifikasi pengguna kepemilikan akun. Hal ini tidak diinginkan untuk memiliki sejumlah besar dari pihak ketiga tersebut; kemampuan ini ditujukan hanya untuk memungkinkan upgrade path, dan hal ini banyak disukai bahwa layanan email ini memberikan pernyataan mereka sendiri.
  13. Mozilla menawarkan layanan mereka sendiri untuk bertindak seperti pihak ketiga yang terpercaya. Penyedia layanan (yaitu, Mengandalkan Pihak) melaksanakan Email Terverifikasi Protokol dapat memilih untuk percaya Mozilla's pernyataan atau tidak. Mozilla layanan memverifikasi akun pengguna kepemilikan menggunakan cara konvensional untuk mengirimkan email dengan link konfirmasi.
  14. Penyedia layanan mungkin, tentu saja, menawarkan protokol ini sebagai pilihan selain metode lainnya(s) otentikasi mereka mungkin ingin menawarkan.
  15. Besar user interface manfaat yang dicari di sini adalah "identitas pemilih". Ketika pengguna mengunjungi sebuah situs dan memilih untuk mengotentikasi, browser mereka menunjukkan mereka sebuah pilihan alamat email ("pribadi", "bekerja", "aktivisme politik", dll.) mereka dapat digunakan untuk mengidentifikasi diri mereka sendiri untuk situs.
  16. Lain besar user interface manfaat yang dicari sebagai bagian dari upaya ini adalah membantu browser tahu lebih lanjut tentang sesi pengguna – siapa mereka masuk seperti saat ini, terutama – jadi mungkin tampilan di browser chrome.
  17. Karena sifat terdistribusi ini sistem, menghindari lock-in untuk situs besar seperti Facebook, Twitter, Google, dll. Setiap individu dapat memiliki domain sendiri dan oleh karena itu bertindak sebagai identitas mereka sendiri penyedia.

Ini tidak benar-benar "bentuk otentikasi berbasis website". Tapi itu adalah sebuah upaya untuk transisi dari norma saat ini otentikasi berbasis bentuk untuk sesuatu yang lebih aman: browser yang didukung otentikasi.

Komentar (2)

Saya hanya berpikir saya'd share ini solusi yang saya temukan untuk menjadi baik-baik saja.

Saya menyebutnya Dummy Lapangan (meskipun saya belum't menciptakan ini jadi don't kredit saya).

Singkatnya: anda hanya perlu memasukkan ini ke dalam <form> dan memeriksa untuk itu harus kosong pada saat memvalidasi:

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

Trik untuk menipu bot ke dalam pemikiran itu harus menyisipkan data ke dalam bidang yang diperlukan, yang's mengapa saya bernama input "email". Jika anda sudah memiliki bidang yang disebut email yang anda're menggunakan anda harus mencoba penamaan dummy bidang sesuatu yang lain seperti "perusahaan", "telepon" atau "emailaddress". Hanya memilih sesuatu yang anda tahu anda don't perlu dan apa yang terdengar seperti sesuatu yang orang-orang biasanya akan menemukan logis untuk mengisi ke dalam bentuk web. Sekarang menyembunyikan input lapangan dengan menggunakan CSS atau JavaScript/jQuery - apa saja yang cocok untuk anda - hanya don't mengatur input type ke tersembunyi atau pun bot won't jatuh untuk itu.

Ketika anda memvalidasi bentuk (baik client atau server side) periksa apakah anda dummy bidang telah diisi untuk mengetahui apakah itu dikirim oleh seorang manusia atau bot.

Contoh:

Dalam kasus manusia: Pengguna tidak akan melihat dummy lapangan (dalam kasus saya yang bernama "email") dan tidak akan berusaha untuk mengisinya. Jadi nilai dummy lapangan masih harus kosong ketika formulir yang telah dikirim.

Dalam kasus bot: bot akan melihat lapangan yang jenis teks dan nama email (atau apapun itu anda menyebutnya) dan logis akan berusaha untuk mengisinya dengan data yang sesuai. Itu doesn't peduli jika anda ditata form input dengan CSS mewah, web-developer melakukannya sepanjang waktu. Apapun nilai yang di dummy bidang ini, kami don't peduli selama itu's lebih besar dari 0 karakter.

Saya menggunakan metode ini pada buku tamu di kombinasi dengan CAPTCHA, dan saya belum't melihat satu spam post sejak. Saya telah menggunakan CAPTCHA-satunya solusi sebelumnya, tapi pada akhirnya, itu mengakibatkan sekitar lima spam posting setiap jam. Menambahkan dummy lapangan dalam bentuk telah berhenti (setidaknya sampai sekarang) semua spam yang muncul.

Saya percaya hal ini juga dapat digunakan baik-baik saja dengan login/autentikasi formulir.

Peringatan: Tentu saja metode ini tidak 100% sangat mudah. Bot dapat diprogram untuk mengabaikan field input dengan gaya display:none diterapkan untuk itu. Anda juga harus berpikir tentang orang-orang yang menggunakan beberapa bentuk auto-completion (seperti kebanyakan browser memiliki built-in!) untuk auto-mengisi semua kolom formulir untuk mereka. Mereka mungkin saja juga mengambil boneka lapangan.

Anda juga dapat bervariasi sedikit dengan meninggalkan dummy lapangan terlihat tetapi di luar batas-batas layar, tapi ini benar-benar terserah pada anda.

Jadilah kreatif!

Komentar (16)

Saya tidak berpikir jawaban di atas adalah "salah" tapi ada daerah besar otentikasi yang tidak menyentuh (atau lebih tepatnya penekanannya adalah pada "bagaimana menerapkan cookie sesi", bukan pada "apa pilihan yang tersedia dan apa trade-off".

Saya menyarankan suntingan/jawaban

  • Masalahnya terletak lebih dalam pengaturan account dari password memeriksa.
  • Menggunakan otentikasi dua faktor ini jauh lebih aman daripada lebih pintar cara enkripsi password
  • Jangan mencoba untuk menerapkan sendiri form login atau penyimpanan database dari password, kecuali data yang disimpan adalah berharga pada pembuatan akun dan dihasilkan sendiri (yaitu, gaya web 2.0 seperti Facebook, Flickr, dll.)
  1. Otentikasi Digest adalah sebuah standar berbasis pendekatan didukung di semua browser utama dan server, yang tidak akan mengirim password bahkan melalui saluran aman.

Hal ini untuk menghindari kebutuhan untuk memiliki "sesi" atau cookies seperti browser itu sendiri akan kembali mengenkripsi komunikasi setiap waktu. Ini adalah yang paling "ringan" pendekatan pengembangan.

Namun, saya tidak merekomendasikan hal ini, kecuali untuk umum, rendah-nilai pelayanan. Ini adalah masalah dengan beberapa jawaban di atas tidak mencoba kembali melaksanakan server-side mekanisme otentikasi - masalah ini telah diselesaikan dan didukung oleh browser yang paling utama. Tidak menggunakan cookies. Jangan simpan apa-apa di tangan anda sendiri-rolled database. Hanya bertanya, per permintaan, jika permintaan dikonfirmasi. Segala sesuatu yang lain harus didukung oleh konfigurasi dan pihak ketiga terpercaya perangkat lunak.

Jadi ...

Pertama, kami membingungkan awal pembuatan akun (dengan password) dengan pengecekan ulang kata sandi selanjutnya. Jika saya Flickr dan membuat situs anda untuk pertama kalinya, baru pengguna memiliki akses ke nilai nol (kosong ruang web). Aku benar-benar tidak peduli jika seseorang membuat akun berbohong tentang nama mereka. Jika saya membuat akun di rumah sakit intranet/extranet, nilai terletak pada semua catatan medis, dan jadi saya melakukan hati tentang identitas (*) account creator.

Ini adalah sangat sangat sulit. Hanya solusi yang layak adalah web of trust. Misalnya, anda bergabung dengan rumah sakit sebagai dokter. Anda membuat sebuah halaman web yang di-host di suatu tempat dengan foto anda, nomor paspor, dan kunci publik, dan hash mereka semua dengan kunci pribadi. Anda kemudian mengunjungi rumah sakit dan sistem administrator terlihat di paspor anda, jika melihat foto yang cocok dengan anda, dan kemudian hash halaman web/foto hash dengan rumah sakit swasta kunci. Mulai sekarang kita dapat dengan aman pertukaran kunci dan token. Sebagai orang yang percaya rumah sakit (ada saus rahasia BTW). Administrator sistem juga dapat memberikan anda sebuah RSA dongle atau lainnya otentikasi dua faktor.

Tapi ini adalah banyak kerumitan, dan web 2.0. Namun, itu adalah satu-satunya cara aman untuk membuat akun baru yang memiliki akses ke informasi yang berharga yang tidak diciptakan sendiri.

  1. Kerberos dan SPNEGO - single sign-on mekanisme dengan pihak ketiga yang terpercaya - pada dasarnya pengguna memverifikasi terhadap pihak ketiga yang terpercaya. (NB ini tidak dengan cara apapun tidak dapat dipercaya OAuth)

  2. SRP - semacam pintar otentikasi password tanpa pihak ketiga yang terpercaya. Tapi di sini kita masuk ke alam "it's lebih aman untuk menggunakan otentikasi dua faktor, bahkan jika itu's lebih mahal"

  3. SSL sisi klien - berikan klien sertifikat kunci publik (support di semua browser utama - tetapi menimbulkan pertanyaan di atas mesin klien keamanan).

Pada akhirnya, itu's tradeoff - berapa biaya pelanggaran keamanan dibandingkan dengan biaya pelaksanaan yang lebih aman pendekatan. Satu hari, kita dapat melihat yang tepat PKI diterima secara luas dan tidak lagi sendiri digulung otentikasi bentuk dan database. Satu hari...

Komentar (1)

Sebuah artikel yang baik tentang realistis kekuatan password estimasi adalah:

Dropbox Blog Teknologi » Blog Archive » zxcvbn: realistis kekuatan password estimasi

Komentar (0)

Ketika hashing, don't cepat menggunakan algoritma hash seperti MD5 (banyak perangkat keras implementasi ada). Menggunakan sesuatu seperti SHA-512. Untuk password, lebih lambat hash yang baik.

Semakin cepat anda dapat membuat hash, lebih cepat setiap brute force checker dapat bekerja. Lambat hash karena itu akan memperlambat brute forcing. Lambat algoritma hash akan membuat brute memaksa praktis untuk lagi kata sandi (8 digit)

Komentar (5)

Favorit saya aturan dalam hal sistem otentikasi: gunakan kata sandi, tidak password. Mudah diingat, sulit untuk retak. Info lebih lanjut: Coding Horror: Password vs. Lulus Frase

Komentar (0)

I'd ingin menambahkan satu saran saya've yang digunakan, berdasarkan pada pertahanan secara mendalam. Anda don't perlu memiliki yang sama auth&auth sistem untuk admin sebagai pengguna biasa. Anda dapat memiliki yang terpisah form login pada url yang terpisah mengeksekusi kode terpisah untuk permintaan yang akan memberikan hak tinggi. Yang satu ini dapat membuat pilihan-pilihan yang akan menjadi total sakit untuk pengguna biasa. Salah satunya seperti yang saya've digunakan adalah untuk benar-benar berebut login URL untuk akses admin dan email admin URL baru. Berhenti setiap serangan brute force segera sebagai URL baru anda dapat sewenang-wenang sulit (sangat panjang string acak) tapi admin anda pengguna's-satunya ketidaknyamanan yang mengikuti link yang ada di email mereka. Penyerang tidak lagi tahu di mana untuk bahkan POSTING ke.

Komentar (2)

Saya tidak't tahu apakah itu yang terbaik untuk menjawab ini sebagai jawaban atau komentar. Saya memilih opsi pertama.

Mengenai poing BAGIAN IV: Lupa Password Fungsi dalam jawaban pertama, saya akan membuat titik tentang Waktu Serangan.

Di Ingat password anda bentuk, penyerang mungkin dapat memeriksa daftar lengkap email dan mendeteksi yang terdaftar di sistem anda (lihat link di bawah).

Mengenai Lupa Password Form, saya akan menambahkan bahwa itu adalah ide yang baik untuk sama kali antara sukses dan unsucessful kueri dengan beberapa fungsi delay.

https://crypto.stanford.edu/~dabo/makalah/webtiming.pdf

Komentar (0)

Saya ingin menambahkan satu hal yang sangat penting komentar: -

  • "Di perusahaan, intra- net pengaturan," sebagian besar, jika tidak semua dari hal tersebut di atas mungkin tidak berlaku!

Banyak perusahaan menggunakan "penggunaan internal hanya" situs-situs yang, efektif, "aplikasi perusahaan" yang terjadi telah dilaksanakan melalui Url. Url ini dapat (seharusnya ...) hanya diselesaikan dalam "perusahaan's jaringan internal." (jaringan Yang ajaib mencakup semua VPN terhubung 'road warriors.')

Ketika pengguna patuh terhubung tersebut di atas jaringan, identitas mereka ("otentikasi") lebih [sudah ...] "secara meyakinkan dikenal," seperti yang mereka izin ("otorisasi") untuk melakukan hal-hal tertentu ... seperti ... "untuk mengakses website ini."

Ini "otentikasi + otorisasi" layanan dapat disediakan oleh beberapa teknologi yang berbeda, seperti LDAP (Microsoft OpenDirectory), atau Kerberos.

Dari point-of-view, anda hanya tahu satu hal: orang yang sah angin-up di situs web anda harus dapat disertai dengan [lingkungan-variabel ajaib yang mengandung ...] "token." (yaitu adanya tanda seperti itu harus segera alasan untuk 404 Not Found.)

Token's nilai tidak masuk akal untuk anda, tapi, harus perlu timbul, "sesuai berarti ada" di mana situs web anda dapat "[otoritatif] meminta seseorang yang tahu (LDAP... dll.)" tentang dan setiap(!) pertanyaan yang mungkin anda miliki. Dengan kata lain, anda melakukan tidak memanfaatkan diri dari ada "rumah-tumbuh logika." sebagai Gantinya, anda menanyakan Kewenangan dan secara implisit percaya putusannya.

Eh eh ... itu's cukup mental-beralih dari "liar-dan-berbulu Internet."

Komentar (3)

Gunakan OpenID Connect atau User Berhasil Mengakses.

Karena tidak ada yang lebih efisien daripada tidak melakukannya sama sekali.

Komentar (0)