Увійти без HTTPS, як захистити?


76

Щодо веб-додатку, коли HTTPS недоступний як засіб безпеки, чи можна зробити вхід дещо безпечним? Наприклад:

  • Токенізувати логіни, щоб ускладнити повторні атаки?
  • Якось зашифрувати надісланий пароль із поля пароля HTML?

Зокрема, я використовую CakePHP та виклик AJAX POST для активації автентифікації (включає вказане ім’я користувача та пароль).

Оновлення проблеми:

  • HTTPS недоступний. Період. Якщо ситуація вам не подобається, розгляньте це як теоретичне питання.
  • Немає явних вимог, у вас є те, що HTTP, PHP та браузер (файли cookie, JavaScript тощо) пропонують у реальному житті (немає магічних двійкових файлів RSA, плагінів PGP).
  • Питання в тому, що найкраще ви можете зробити із цієї ситуації, тобто краще, ніж надсилати паролі у відкритому тексті. Знання недоліків кожного такого рішення є плюсом.
  • Будь-яке покращення, ніж звичайні паролі, вітається. Ми не прагнемо до 100% рішення l33tG0Dhx0r-proff. Складно зламати краще, ніж складно зламати, що краще, ніж тривіальне нюхання, що розкриває пароль.

9
Наскільки безпечно? Наскільки високі ставки (показник доларового поля може бути корисним орієнтиром)? Наскільки потужні потенційні зловмисники? Я б не торгував акціями та не ділився своїми найтемнішими секретами на веб-сайті, на якому не було SSL. :)
mctylr

2
@mctylr Цей тип безпеки, очевидно, не є військовим, фінансовим чи державним. Але все-таки краще, ніж звичайний текстовий логін, який, на жаль, є загальним для невеликих сайтів або сайтів, які повинні працювати за важкими брандмауерами, що фільтрують HTTPS, або для дешевих хостингових сайтів, що не надають HTTPS (навіть не підписаного для різної URL-адреси). Питання цікавиться будь-яким можливим способом підвищення будь-якого аспекту безпеки.
sibidiba

2
@ The Rook: факти та сценарії, як і вимоги, не є демократичними
sibidiba

3
як ваша програма захищається від атак, таких як пожежа, або має справу з OWASP A9?
грак

4
Я настійно рекомендую змінити відповідь на це запитання будь-кому іншому або залишити без відповіді. Нинішня відповідь жахлива.
грак

Відповіді:


75

HTTPS є надзвичайно важливим для підтримання безпечного зв’язку між веб-сайтом та браузером. Загальнодоступні мережі Wi-Fi піддають користувачів ризику , і при правильному використанні HTTPS є єдиним інструментом, який може захистити облікові записи користувачів від цієї вразливості .

Якщо ваш хост не підтримує HTTPS, тоді така служба, як Cloudflare Universal SSL, може бути використана для забезпечення всіх браузерів, що підключаються до вашого сайту за допомогою HTTPS, навіть якщо ваш сервер не підтримує SSL / TLS . Зв'язок між Cloudflare та вашим веб-сайтом все ще буде незахищеним, але ця служба Cloudflare призначена для захисту користувачів від загроз, знайдених у загальнодоступних мережах Wi-Fi. З точки зору тестера проникнення, ненадання HTTPS є надзвичайно підозрілим, якщо ви не надаєте основних вимог безпеки як доставки трафіку, то яких інших вимог безпеки ви втрачаєте? Сертифікати HTTPS можна отримати безкоштовно, використовуючи Let's Encrypt або Start SSL , немає жодної законної причини не підтримувати HTTPS.

HTTPS життєво важливий, оскільки він робить набагато більше, ніж просто "шифрування паролів". Інша важлива роль полягає в тому, що вона повинна перешкоджати користувачеві входити на шкідливий сервер, який видає себе за справжній сервер. Застосування системи для захисту лише пароля все ще є порушенням OWASP A9 - недостатній захист транспортного рівня, оскільки ви все одно передаватимете облікові дані сеансу у вигляді простого тексту, що є всім необхідним зловмиснику ( Firesheep ).

  1. Криптографію на основі JavaScript не можна використовувати для побудови захищеного транспортного рівня .

  2. "Токенізувати логіни": Якщо зловмисник нюхає трафік, у нього буде звичайне текстове ім'я користувача / пароль, а потім вони зможуть просто увійти за допомогою цих нових облікових даних. (Повтор атаки)

  3. "Якось зашифрувати переданий пароль": Після того, як людина увійшла в систему, зловмисник може перенюхати трафік, щоб отримати дійсний ідентифікатор сеансу (cookie), а потім просто використовувати це замість входу. Якщо весь сеанс був захищений SSL / TLS, тоді це не проблема.

Є й інші більш складні атаки, які впливають як на цю систему, так і на нашу поточну інфраструктуру SSL. SSLstrip атака переходить в більш докладно. Я настійно рекомендую дивитися виступ Blackx 2009 від Moxie Marlinspike , який призвів до стандарту HTTP-Strict-Transport-Security .


6
Мені (дещо) відомо про те, що S пропонує в HTTPS. Але HTTPS це НЕ є в даному випадку. Моє питання все ще відкрите, що найкраще, що варто робити, коли воно недоступне?
sibidiba

49
HTTPS це НЕ є. Існуючі проблеми більшу частину часу не можна вирішити, вимагаючи, щоб ситуація змінилася на таку, коли проблема не виходить. Припустимо, ви опинились на Південному полюсі після авіакатастрофи. / Вижила: Як нам з цього вийти? Немає покриття мобільної мережі для виклику довідки. / Ви: Ми повинні викликати допомогу по телефону! / Survivor: На цьому континенті немає покриття мережі. / Ви: Покриття мережі повинно бути завжди доступним.
sibidiba

6
Ладья перерахував безліч безлічі застережень щодо способів застрілитися (mitm тут особливо поганий). Єдина пропозиція, яку я маю, - це розглянути автентифікацію дайджестів, яка не особливо роздута. Він все ще сприйнятливий до MITM, оскільки без сторінки входу в SSL я навіть не знаю, чи надійшов від вас HTML-код запиту на вхід, тому я міг відмовитись від мене. В основному ви жартуєте над системою паролів. Я не кажу про те, щоб бути злим або в обличчя. З'ясуйте, як вирішити проблему "no-SSL", або моліться, щоб ваш сайт не зацікавився
Джейсон,

9
@sibidiba: Справа в тому, що без SSL ви не можете зробити його безпечним. Так, схема, до якої ви зв’язали, „краща за паролі простого тексту“. Але це все ще навіть не "дещо безпечно". Іноді просто немає хорошого рішення проблеми, крім зміни сценарію. Якщо вам потрібна безпека, ваш вибір хостингу (або яке б там не було обмеження) помилковий.
Ендрю Коулсон,

3
@sibidiba: Ви, мабуть, пропустили ту частину, коли я сказав: "Так, це краще". Це не означає, що ви б називали WEP "безпечним", оскільки це не так. Так, це питання семантики, але важливо розрізнити, чи називати ви щось „безпечним”.
Ендрю Коулсон,

16

Коротка відповідь полягає в тому, що без шифрування кінцевої точки до кінцевої точки SSL неможливо зробити це надійно ...

Однією з основних причин цього є те, що ви не можете захистити криптовалюту в браузері. Див. Це посилання - Криптографія Javascript вважається шкідливою .

Крім того, ви не можете бути впевнені, що джерелом даних є справді той, з ким ви розмовляєте. Це означає, що без SSL абсолютно ніяк не можна бути впевненим, що не відбувається атаки "Людина в середині" .

Так що ні, ти не можеш цього зробити.

Крім того, навіть не намагайтеся. Отримайте SSL. Ви можете отримати безкоштовні сертифікати. Хости, як правило, дають вам спеціальну IP-адресу за кілька $$$ на місяць. І якщо ви дійсно піклуєтеся про безпеку, ви все одно використовуєте принаймні ВМ із виділеною IP-адресою.

Навіть спробувати це було б у кращому випадку безпекою через невідомість , а в гіршому нічим. SSL - вирішена проблема. Чому б не використовувати це рішення. Безпека - це не те, про що можна здогадуватися. Використовуйте належні прийоми. Не намагайтеся вигадувати своє. Це не спрацює ...


1
Я хотів би лише додати: якщо хтось читає це, думаючи, що знайшов спосіб розробити захищений протокол, кращий за TLS, він повинен надіслати його до IETF для розгляду нового стандарту Інтернету. :)
Скотт Арчішевскі

16

Оскільки ви не можете робити SSL на веб-сервері, і ви не є експертом з безпеки, шукайте існуючу службу безпечної автентифікації, яку ви можете використовувати, і дозвольте їм обробляти як SSL, так і складність обробки облікових даних для вас.

Зокрема, я б порадив вам скористатися безкоштовною службою автентифікації сторонніх розробників, такою як OpenID . Вони мають бібліотеки для PHP, включаючи бібліотеку для CakePHP .


Редагувати: (про ризики)

Використовуючи сторонню службу захищеної автентифікації (яка використовує сам HTTPS), може пом'якшити проблему з самою автентифікацією, не використовуючи HTTPS (на вашому сервері), це не повністю виключає можливість атак.

Найпоширенішими двома атаками є повторні атаки та викрадення сеансу, коли зловмисник може повторно використовувати справжній маркер сеансу входу пізніше, або використовувати дійсний маркер сеансу для власних зловмисних цілей.

Атару повторного відтворення можна пом'якшити, закінчивши термін дії маркера сеансу, і бажано, використовуючи nonce для запобігання повторному відтворенню сесії та зменшення ризику викрадення сесії. У випадку nonce законний сеанс генерує помилку, якщо його успішно викрали, оскільки термін дії nonce закінчився (був використаний), тому власний сеанс більше не діє.

Якщо ви не можете використовувати HTTPS для шифрування маркера сеансу під час передачі на ваш сервер і з нього, ви не можете повністю запобігти активним атакам, таким як викрадення сесії або атака " людина посередині" . У деяких випадках це може бути прийнятним, наприклад, веб-сайти з невеликою базою користувачів для некомерційного використання.


1
Моє мислення точно. Якщо у вас не може бути SSL на вашому сервері, дозвольте сторонній стороні зробити SSL за вас.
stevenf

7
Це дуже погана ідея. Проблема в тому, що автентифікація - це найменше з ваших турбот. Вам потрібно захистити весь сеанс. Найслабша частина вашої системи - це сила всієї системи. І оскільки ви відкрили OpenID, ця стаття про зламану автентифікацію StackExchange є
доречною

2
@ircmaxell За винятком статті, яку ви цитуєте, не може пояснити, що його демонстрація не визначає потенційне рішення обговорюваної слабкості, яка вже може існувати, управління сеансами на стороні сервера, де сеанс має ключ до IP-адреси, можливо, nonce або сіль і має термін придатності. Тобто зловмисникові знадобиться активна атака, яка здійснює підробку IP-адреси, а не просто пасивне прослуховування (обнюхування) трафіку TCP / IP або WiFi, тоді як законний користувач активно входить в систему.
mctylr

2
Потрібно захистити весь сеанс . Це повертається до того, що для отримання вичерпної відповіді вам потрібно зробити оцінку ризику конкретної ситуації та зважити ризик / винагороду від атак проти безпеки. Якщо TLS / SSL недоступні, тоді будь-яке рішення буде залежати від відсутності секретності (або надмірної доступності в розумінні ЦРУ ), але це не обов'язково означає, що цілісність, автентифікація або невідмова є абсолютно неможливими в залежності на рівні необхідної впевненості.
mctylr

Ця відповідь звучить правдиво, але я думаю, що будь-який поважний постачальник автентифікації вимагатиме від вас принаймні тих самих вимог безпеки, що і сеанс TLS. Тож залишається з’ясувати, чи це практичне рішення. І так, ви все одно не захищали б дані, що надсилаються до браузера, - але це менш погано, ніж витік деталей автентифікації або дозвол повторного відтворення.
Maarten Bodewes

13

Як ви запропонували, можливо, ви зможете генерувати унікальний маркер щоразу при створенні сторінки. Цей самий маркер потрібно буде відправити назад із даними форми та не можна використовувати повторно. Ви також можете захистити пароль, використовуючи JavaScript для його хешування, якщо ви можете покладатися на те, що його ввімкнуть ваші користувачі.

Однак ця схема все ще не безпечна. Зловмисник все ще міг бачити, що все проходить через дріт. Вони можуть перехопити маркер і надіслати відповідь вам до того, як це зробить користувач. Або вони можуть просто почекати, поки хтось увійде, викрасти облікові дані цієї людини (оскільки вони надсилаються по дроту) і просто зробити власний запит на вхід пізніше.

Підсумок - вам потрібно використовувати HTTPS, щоб гарантувати безпеку сайту.


6

Ви можете зашифрувати пароль за допомогою Javascript і розшифрувати його на сервері.

Я рекомендую згенерувати пару ключів RSA на сервері, надіслати відкритий ключ разом із приуроченою сіллю до браузера, а потім зашифрувати пароль, поєднаний із сіллю, використовуючи відкритий ключ у Javascript.

Ви можете знайти реалізацію RSA в Javascript тут

Ви повинні включити і IP-адресу, і весь хедер X-FORWARDED-FOR до файлів cookie для автентифікації, щоб запобігти крадіжці файлів cookie за проксі.

Якщо ви маєте справу з конфіденційними даними, ви можете створити випадковий ключ AES у Javascript , а потім надіслати його на сервер разом із паролем, зашифрованим RSA.
Потім ви можете змусити всю програму використовувати зашифровані запити AJAX з однієї сторінки і взагалі не використовувати cookie-файл auth.

Зверніть увагу, що неможливо захистити від активної атаки людини посеред без SSL. Активний зловмисник може повністю замінити ваш сайт власним проксі-сервером, і немає жодної можливості захиститися від цього. (Оскільки не може бути жодного відомого хорошого коду)


1
Це допустиме використання RSA, але це спірне питання. Це не завадить комусь зламатися.
грак

4
Насправді, я не бачу, як такий підхід запобігає нападу людини посередині.
mctylr

2
За винятком того, що RSA не може бути надійно зроблений на стороні клієнта . Тож все це працює даремно ...
ircmaxell

3
Цей пост слід змінити, це безпека Cargo-Cult. matasano.com/articles/javascript-cryptography
ладья

1
@Jeremy Banks гарне запитання. У сценарії SLacks зловмисник може отримати відкритий текст, змінивши відповідь HTTP, та заднім шаром процесу шифрування . Два інших ресурси за цією темою: owasp.org/index.php/Session_Management_Cheat_Sheet та owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet . Коротше кажучи, якщо зловмисний користувач може отримати обліковий запис адміністратора, то хто дбає про те, який пароль, це закінчено.
ладья

6

Ви можете використовувати HTTP Digest аутентифікацію, яка підтримується більшістю браузерів і не надсилає пароль чітко по дроту.

Недоліком є ​​потворне вікно входу, яке відображає браузер. Якщо ви бажаєте дотримуватися форм, тоді ви можете реалізувати точно такий самий протокол, як HTTP Digest в аутентифікації форм: надішліть приховані поля, що містять сферу та виклик, і попросіть клієнта додати в JavaScript nonce та обчислити дайджест. Таким чином, ви скористаєтесь добре відомим і перевіреним протоколом обміну, а не прокручуєте власний.

HTTP Digest вимагає лише хеш-операцій.


Чи можливий вихід із системи зараз? Як я можу виявити з боку сервера, що вхід був успішним?
sibidiba

1
Ви все ще контролюєте процес автентифікації, це відбувається на php-скриптах сервера. Ви аутентифікуєте форму відповіді щодо бази даних користувача, де у вас є ім’я користувача та частина HA1 дайджесту http, тобто. md5 (користувач: царство: пароль). З відповіді ви реконструюєте хеш дайджесту, починаючи з HA1, що зберігається в базі даних, і порівнюєте його з відповіддю у формі подання, якщо вони збігаються, це означає, що користувач мав правильний пароль.
Remus Rusanu

1
Великою перевагою перед іншими схемами є те, що вона дозволяє уніфіковану модель автентифікації для сеансів браузера / користувача (з використанням форм та файлів cookie, але не передаючи пароль по дроту) та служб REST за допомогою HTTP Digest.
Ремус Русану

Вихід виконується звичайним способом шляхом скидання файлу cookie. Це правда, що якщо користувач потрапляє у браузер до частини, яка вимагає від нього зробити HTTP-дайджест (наприклад, вводить REST-URL із сайту), і якщо користувач вводить правильний пароль у діалоговому вікні входу в браузер, це набагато складніше для виходу: користувач повинен вручну очистити пароль із налаштувань браузера. Але це не повинно відбуватися нормально, оскільки UI частина сайту зазвичай відокремлена від REST частини.
Remus Rusanu

2

А як щодо HTTP-дайджест-автентифікації ? Він забезпечує безпеку за допомогою хешування MD5, імені користувача, пароля та nonce (серед іншого) перед відправкою їх на сервер. MD5 насправді не є безпечним, але це хороший спосіб для простої безпеки за допомогою HTTP.

Звичайно, це не заважає хакерам змінювати повідомлення ... але захищає ваш пароль.


1
Дайджест можна нюхати і відповісти. HTTP-дайджест-автентифікація вимагає HTTPS для захисту облікових даних, переданих як заголовок http "Авторизація".
грак

MD5 захищений для виведення ключів. Однак це не безпечно, оскільки хеш пароля, і тому пароль все одно може просочитися.
Маартен Бодеус

2

HTTPS має безліч випадків використання, більшість з яких призначені для захисту від атак "Людина посередині". Той, хто має розум хакера, здригнеться, сказавши вам, що крім встановленого способу щось досягти не існує. Справа в тому, що те, що ви використовуєте TLS (стандарт, який використовує сучасний HTTPS), не означає, що ви використовуєте його добре. Крім того, просто використання TLS не заважає комусь використовувати відомі слабкі місця. Подібно до того, як ви можете знайти творчі способи захисту своїх даних, є люди, які знаходять творчі способи використовувати ваші заходи безпеки.

Отже, що робити?

Перш за все, якщо ви збираєтеся відмовитися від TLS, корисно зрозуміти, як це працює. І вся справа в рукостисканні.

Після того, як клієнт і сервер погодилися використовувати TLS, вони узгоджують з'єднання з використанням стану за допомогою процедури рукостискання. [7] Під час цього рукостискання клієнт і сервер узгоджують різні параметри, що використовуються для встановлення безпеки з'єднання:

  • Рукостискання починається, коли клієнт підключається до сервера з підтримкою TLS, що вимагає безпечного з'єднання, і представляє список підтримуваних наборів шифрів (шифри та хеш-функції).
  • З цього списку сервер вибирає шифр і хеш-функцію, яку він також підтримує, і повідомляє клієнта про рішення.
  • Сервер надсилає свою ідентифікацію у вигляді цифрового сертифіката. [Суперечність] Сертифікат зазвичай містить ім'я сервера, довірений центр сертифікації (CA) та відкритий ключ шифрування сервера.
  • Клієнт може зв’язатися із сервером, який видав сертифікат (довіреним центром сертифікації, як зазначено вище), і підтвердити дійсність сертифіката перед тим, як продовжити.
  • Для того, щоб згенерувати сеансові ключі, що використовуються для безпечного з'єднання, клієнт шифрує випадкове число за допомогою відкритого ключа сервера і надсилає результат серверу. Лише сервер повинен мати можливість розшифрувати його за допомогою приватного ключа.
  • Із випадкового числа обидві сторони генерують ключовий матеріал для шифрування та дешифрування. [Суперечність] На цьому завершується рукостискання та починається захищене з'єднання, яке зашифровується та розшифровується разом із ключовим матеріалом, поки з'єднання не закриється.

Якщо якийсь із вищевказаних кроків не вдається, рукостискання TLS не вдається, і підключення не створюється.

Джерело: Вікіпедія

Отже, чи можливо це? Так. Мене навчили, що все можливо. Це може коштувати дорого, але це завжди можливо.

Я хочу повністю сказати, що Я НЕ професіонал охорони, а просто ентузіаст. Я не рекомендую робити це для виробничого проекту чи чогось іншого, крім власного навчання. Ви БЕЗКОШТОВНО повинні перевірити цю публікацію SO, яка пропонує чудове пояснення щодо перешкод у створенні власного протоколу безпеки.

Однак, якщо ви хочете рухатися далі, ось кілька думок, які приходять вам на думку. Це реальності, які існуватимуть незалежно від того, на який напрямок ви пішли з цим проектом.

  • HTTPS підтримується усіма основними сучасними браузерами. Навіть за такої реальності час завантаження HTTPS є повільнішим, ніж звичайний HTTP. Без великого виробництва дуже ймовірно, що ваша альтернативна реалізація буде настільки ж безпечною, хоча і значно повільнішою. Це буде недоліком будь-якої власної реалізації, якщо ви не використовуєте функції браузера, що повертає нас повним колом до використання TLS, що використовує сучасний HTTPS.

  • Якщо вам вдається зашифрувати свій пароль без TLS на стороні браузера, використовуючи Javascript досить непередбачувано, що атака MiTM буде важкою, не відпочивайте там. Ви також повинні захищати дані, які ви надсилаєте туди-сюди. В іншому випадку зашифрований пароль дійсно не має значення. Звичайно, зловмисник може не знати пароля bobsmith109, але йому це не потрібно, оскільки він може нюхати кожну окрему діяльність у мережі. Він знає, коли раптом входить bobsmith109, можливо, може простежити його IP-адресу та будь-яку іншу конфіденційну інформацію, яку ви надсилаєте туди-сюди.

  • Незалежно від того, які заходи безпеки ви вживаєте, вони є глибокими. Тож одне, що ви можете зробити відразу, це переконайтесь, що ви зашифруєте свої дані в базі даних, а також вимагаєте надійних паролів.

Я повторюю, що я не є професіоналом охорони, і настійно не рекомендую це робити нічим, крім як задовольнити вашу цікавість. Астрономічно неймовірно, що ви можете створити життєздатну альтернативу TLS без надзвичайно великої групи професіоналів безпеки, які вносять вклад у проект роками, якщо не десятиліттями, чим може похвалитися SSL / TLS. З огляду на це, гарною відправною точкою, якщо ви вирішите піти вперед, є розглянути модель рукостискання вище і побачити, як ви можете реалізувати версію цього без TLS.

Мені б неприємно не ділитися у своєму дописі з тим, що з більшістю реальних бар'єрів на шляху використання HTTPS активно борються. Один з найбільших - за вартістю - дуже близький до того, щоб стати непроблемним. Безкоштовний орган сертифікації вийде у 2 кварталі 2015 року, підтримуючи деякі великі гармати, включаючи Mozilla та Akamai, щоб назвати декілька. Ось стаття .


У цій "відповіді" не вказано нічого, що можна використати. Там написано "Так чи можливо?" але вона навіть не заявити , що це можливо. Деякі махають руками про те, що це дорого, навіть не вказуючи, що це таке. Можливо "налаштування власного протоколу безпеки". Потім закінчується деякими підводними каменями зі створення власного протоколу. Просто основна порада щодо безпеки, але жодного рішення (яке справді може не існувати). Нічого про те, як запобігти атакам MitM або обійти проблему з відсутністю надійних сертифікатів CA в JavaScript.
Maarten Bodewes

2

Увійти без HTTPS, як захистити?

Оскільки між вашим сервером і клієнтом немає захищеного каналу:

  • оскільки немає захищеного каналу, кожен може відстежувати ваш трафік.
  • оскільки кожен може підслідити трафік, ви відкриті для атаки MITM.
  • оскільки ви відкриті для атаки MITM, немає гарантії, що ваш клієнт побачить законну сторінку.
  • оскільки сторінки не є законними, а ваша сторінка фактично не обслуговується (хлопець посередині обслуговує сторінки), усі трюки, використані на стороні сервера, стають марними.

Що ти можеш зробити? Теоретично?

  • як клієнт, так і сервер повинні використовувати шифрування, щоб зробити перегляд / MITM менш сприйнятливим.
  • припустимо, у вас не може бути рукостискання,
  • припустимо, що ваш клієнт уже має ваш ключ і знає, як говорити так само безглуздо, як і ваш сервер.
  • як щодо якихось SSL через HTTP, але загорнуті в кодоване повідомлення base64 для якогось тупінгу?

Але зачекайте ... Оскільки ви сказали, що немає магічного двійкового файлу або плагіна, навіть RSA, я не знаю, чи можливо щось із цього, за винятком (можливо, дуже слабкого) внутрішнього шифрування.

-


Будь-яке внутрішнє шифрування можна просто видалити.
Скотт Арчішевскі,

1

Ви можете спробувати скопіювати його до певної точки, скориставшись шифруванням із відкритим ключем (можливо, GPG) та скориставшись кешуванням браузера.

Це не щось безпечне, навіть простого розміщення SSL буде недостатньо для досвідченого зловмисника, вам потрібно використовувати HSTS, закріплення відкритих ключів тощо, щоб просто розглянути веб-сайт безпечним сьогодні .

Решта відповіді - це лише поживи для роздумів.

  1. Створіть пару відкрито-приватних ключів. Бережіть приватну.
  2. Створіть файл js, що містить відкритий ключ та encryptфункцію, знайдіть захищений алгоритм шифрування. Ця функція повинна шифрувати заданий рядок (серіалізовану форму) з додатковою позначкою часу, щоб уникнути атаки реплікації.
  3. Подайте цей файл із Cache-Control:public, max-age=31536000заголовком HTTP. Ми намагаємося пом'якшити ситуацію, коли зловмисник намагається замінити сценарій. Файл завжди буде подаватися з кешу браузера.
  4. Надсилайте всі форми через Javascript, використовуючи encryptфункцію. Подавайте їх із тим же заголовком, що і вище.
  5. На стороні сервера, decryptдані, перевірте мітку часу, якщо вона все ще діє. Якщо ви ні, відкиньте це.
  6. Створіть маркер cookie, який можна використовувати лише один раз протягом дуже короткого періоду часу. Якщо зловмисник захопить печиво, у нього не буде багато часу робити щось. Однак, якщо зловмисник досить швидкий, він може вийти з початкового користувача.
  7. Змінюйте файли cookie при кожній відповіді. Але що тоді робити, коли користувач надсилає кілька запитів одночасно, а потім вони надходять у зворотному порядку? Яке cookie є дійсним? Це створює безліч проблем ціною помилкового почуття безпеки.

Будь-які слухачі не зможуть користуватися даними вперед і назад, і вони не зможуть змінювати / вводити існуючі JS файли, поки кеш не закінчиться / користувач не очистить кеш. Однак будь-який досвідчений зловмисник може замінити цілий HTMLфайл, який відкине всі виміри безпеки, про які я щойно згадав. Якщо ви можете принаймні обслуговувати цей файл / сформувати більш HTTPS, ви могли б піти з ним, покласти їх на сторінках GitHub або будь-який інший . Однак, якщо ви додаєте файл до іншого домену, вам потрібно налаштувати CORSдомен-одержувач, щоб це працювало.

Ще одна спроба

Одноразові паролі надсилаються на електронну пошту.

  1. Користувач заповнює свою електронну пошту, натискає посилання, яке потім надсилає посилання на його електронну пошту з маркером, що дозволить їм увійти в систему.
  2. Користувач натискає посилання
  3. Сервер перевіряє маркер, реєструє користувача.
  4. Прокручує файли cookie, як у попередньому прикладі.

Загалом, що б ви не робили, це не безпечно . За умови швидкого, витонченого нападника ніщо не заважає.

Отримайте SSL, якщо інфраструктура його не підтримує, змініть його. Якщо ваш менеджер не вірить у SSL, переконайте його / її. Не створюйте хибного відчуття безпеки. Захистіть дані своїх користувачів, залежно від вашого місцезнаходження, ви зобов’язані захищати дані своїх користувачів.

Тоді давайте поговоримо про те, як зробити сайт захищеним за допомогою SSL.


1

Створіть пару відкритих / приватних ключів за допомогою асиметричного шифру.

Створіть симетричний ключ на сервері.

Відправте відкритий ключ на сторону клієнта.

Створіть випадковий ключ для клієнта симетричного шифру.

Зашифруйте цей випадковий ключ, використовуючи сторону клієнта відкритого ключа.

Надішліть зашифрований ключ на сервер.


Сервер робить наступне:

a. Розшифровує випадковий симетричний ключ за допомогою закритого ключа.

b. Створює маркер, що містить згенерований клієнтський ключ.

c. Підписує маркер.

d. Шифрує маркер за допомогою симетричного ключа сервера.

e. Шифрує вже зашифрований маркер за допомогою генерованого клієнтом ключа.

f. Надсилає зашифрований маркер.


Клієнт отримує цей маркер і робить наступне:

a. Розшифровує маркер за допомогою генерованого ключа.

b. Зберігає розшифрований маркер.

c. На даний момент збережений маркер шифрується лише симетричним ключем сервера.


На кожному від клієнта до сервера:

a. Зашифруйте вихідні дані за допомогою генерованого клієнтом ключа.

b. Надішліть маркер + зашифровані дані


На кожен запит сервер отримує:

a. Розшифруйте маркер за допомогою симетричного ключа сервера.

b. Перевірте підпис.

c. Розшифруйте дані за допомогою ключа, створеного клієнтом, що зберігається в маркері.


Я припускаю, що це те, як захистити з'єднання, але робити вхід через це згодом має бути тривіально. Це як рудиментарна версія HTTPS, виконана вручну.
Hedzer

0

Погляньте на "Протокол безпечного віддаленого пароля" .

Замість того, щоб формулювати це сам, дозвольте мені процитувати їх веб-сайт:

Протокол Secure Remote Password забезпечує безпечну віддалену автентифікацію коротких запам’ятовуваних людиною паролів і протистоїть як пасивним, так і активним мережевим атакам.

і:

Протокол [] поєднує в собі технології перевірки нульових знань з асиметричними протоколами обміну ключами і пропонує значно покращену продуктивність порівняно сильних розширених методів, які протистоять атакам викрадених перевірок, таких як Augmented EKE або B-SPEKE.

Хоча Стенфордський університет не пропонує реалізацій для PHP та JavaScript, вони посилаються на деякі сторонні реалізації.

Одне з цих посилань веде до "Clipperz" , який є онлайн-менеджером паролів. Він також доступний як спільне видання на GitHub. Там вони розміщують свою "javascript-crypto-бібліотеку" , яка реалізує протокол і сам "менеджер паролів" , який містить бекенди, написані на PHP та Python.

Я не можу сказати, наскільки важко було б отримати відповідні частини коду, але, можливо, ви можете використати їх реалізацію повторно (це ліцензовано згідно AGPL).

Редагувати 2014/10/24:

У статті Вікіпедії про SRP перелічено ще деякі реалізації. Відповідне для PHP / JS:


2
JavaScript не можна використовувати як захищену систему в цьому контексті: matasano.com/articles/javascript-cryptography
грак

SRP - чудовий протокол, який часто ігнорують. Принаймні, він не надсилатиме жодного пароля у відкритому режимі перед встановленням спільного секрету (який можна використовувати для автентифікації). Однак я погоджуюсь з граком, що це не вирішує проблеми з JS crypto.
Maarten Bodewes

-1

Найкраще рішення, яке я бачив для дещо захищених з'єднань HTTP, - це використання реалізації Javascript md5sum (або якогось іншого хешу), щоб уникнути передачі пароля у відкритому тексті. Ви можете створити обробник onsubmit форми у Javascript, який замінює поле пароля хешем вихідного значення. Це додає скромний захист незахищеному з’єднанню, але для належної роботи покладається на роботу Javascript у браузері.


Це нічого не зупиняє, зловмисник просто викраде сеанс після його автентифікації.
грак

1
Що б не сказав Майкл. Якщо ви все-таки використовуєте md5, принаймні, щоб сервер надіслав унікальний виклик, клієнт повинен надіслати md5 (виклик + пропуск). Надсилання md5 (пароль) для більшості користувачів - це те саме, що і передача в чистому вигляді. Більше, ніж повторне відтворення, більшою стурбованістю буде пасивний зловмисник, який може зламати більшість ваших паролів користувачів. Крім того, якщо у вас http, і у вас активний зловмисник, крім повторного відтворення форми та викрадення форми, було продемонстровано, що зловмисник може вводити скрипт для модифікації форми входу, щоб вони отримали копію введеного імені користувача та пароля. використовуйте https, якщо ви не підтримуєте якийсь дивний мобільний пристрій.
бер.

1
@Rook Ваша критика стосується будь-якого правдоподібного рішення, яке не використовує SSL, як ви вже чітко вказали. Давайте сприймемо як даність того, що всі вони вразливі до цього.
Нік Джонсон,

"але для коректної роботи покладається на Javascript, який працює у браузері." ... і зловмисник може просто замінити js чимось, що надсилає йому пароль.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

1
JavaScript не можна використовувати як систему безпеки в цьому контексті: matasano.com/articles/javascript-cryptography
грак

-2

Думаю, ви дбаєте про безпечну передачу пароля на сервер? Моя відповідь: не передавати паролі на сервер :)

Фактично ви не можете передавати нічого з браузера (користувача) на сервер для автентифікації користувача, оскільки зловмисник, який шпигує за трафіком http, також зможе повторно передати дані та автентифікуватись.

Пропозиція:

Очевидним рішенням буде використання односторонньої одноразової аутентифікації транзакцій, що походить із сервера; як номер транзакції, який можна використовувати лише один раз. Зрештою, вам все одно потрібен захищений канал, щоб синхронізувати список номерів транзакцій з користувачем.

Ви можете скористатися чимось аутентифікатором Google , але для налаштування параметрів з обох сторін вам потрібен один раз захищений канал. Якщо ви вважаєте електронну пошту безпечною, це може бути найкращим способом.


А як щодо захисту інших облікових даних автентифікації, таких як ідентифікатори сеансів? Чи знайомі ви з топ-10 OWASP?
грак

ха-ха, автор запитує про спосіб безпечного входу без https, звичайно, є величезні інші моменти, які слід врахувати, але хто запитував про ідентифікатори сеансів? Ви впевнені, що автор хоче підтримувати сеанси?
comeGetSome

Навіщо захищати лише один тип облікових даних автентифікації? Цей пост мені здається безпечним для вантажів.
грак

весь пост проти овасп. це не означає, що відповіді немає.
comeGetSome

-2

У мене така ж проблема з моєю системою. Я вжив заходів, щоб спробувати підвищити рівень безпеки, не загрожуючи зручності роботи заплутаних механізмів. Що я помітив, так це те, що переважна більшість користувачів увійшли з однієї машини за допомогою одного браузера (але необов’язково з тієї ж IP-адреси) або з декількох браузерів (наприклад, настільних чи мобільних). Я вирішив, що можу використати це для виявлення закономірності.

1) Під час реєстрації користувачі повинні мати надійні паролі (для запобігання атакам словників), захисне запитання / відповідь та стандартну перевірку електронної пошти (як доказ реальної особи)

2) Під час входу, після 5 невдалих спроб входу (не раніше), відображається капча для запобігання атакам грубої сили.

3) Нарешті, я створив хеш частин рядка агента користувача після успішного входу, що містить ОС користувачів, браузер (загалом, не версії) та мову - формуючи такий собі вторинний пароль. Якщо хеш useragent значно відрізняється при наступному вході, користувачеві пропонується відповісти на питання безпеки. Потім, якщо відповідь на це задовільна, новий рядок UA хешується і додається до їхнього списку "безпечних машин", так що їх більше не будуть запитувати з цієї машини. Це схоже на механізм, який застосовується ігровою системою Steam.

Це використовується вже понад рік дуже успішно з близько 700 користувачами, і це мало додаткову перевагу запобігання "спільному входу" - проблема, коли кілька користувачів використовували однакові облікові дані для зручності!


Агент-користувач контролюється зловмисником. Якщо зловмисник перебуває у відкритій мережі Wi-Fi, він може обнюхувати трафік, отримати повний ідентифікатор сеансу, а також поточний агент користувача. Ви чули про топ-10 OWASP?
грак

Ніщо, крім HTTPS, не запобіжить атакам MITM. Питання ставить питання про те, які заходи можна вжити для підвищення безпеки, а не зупинки спеціальної атаки. Шаблон, що відповідає поведінці користувачів, являє собою додатковий рівень безпеки. Випадковому хакеру доведеться вгадати рядок UA законного користувача, щоб підробити його, або поставити перед питанням безпеки.
Дейв

Те, що описує цей пост, - це безпека культового вантажу, і єдиною людиною, яку він обманює, є програміст.
грак

@Rook, чи можете ви додати будь-яке пояснення, чому ви вважаєте, що це культ вантажів? Steam дуже покладається на цей механізм, і, як я вже пояснив, він вирішив цілком реальну проблему спільного доступу до входу в моїй компанії.
Дейв

1
Але ви розглядаєте лише атаки MITM, де зловмисник має доступ та необхідні знання для компрометації сеансу користувачів. Моє рішення полягає у зменшенні втрати пароля для третьої сторони, крім законного користувача. Це набагато більш поширена форма порушення безпеки, і ваш коментар стосується іншого питання безпеки, ніж той, який я намагаюся запобігти.
Дейв

-2

Відповідь коротша, і якщо ви дійсно маєте значення щодо безпеки, у вас завжди є варіанти різних рівнів бюрократії.

Абсолютної безпеки не існує. Недолік номер один завжди на стороні клієнта, з троянами та кейлоггерами . SSL у цьому не допомагає.

1) Генератори токенів : банки використовують їх, а хуртовина - тоді. Це може бути пристрій або додаток. Ну .. це дорого.

2) SMS-шпильки . цікаве та доступне рішення. На ринку є багато вигідних цін на тринаціональні смс-повідомлення, і кожен має телефон, який може його прийняти.

3) Якщо вам потрібно використовувати HTTP, ви можете примусити сторонню службу авторизації, як-от google або facebook . Це найкраще, що ви можете обійтися без генератора токенів.


-3

Використовуйте механізми хешування, щоб зберігати пароль і завжди порівнюйте хешований пароль, тоді ніхто не знає справжній пароль, навіть ви. Це дуже просто, але ефективно. Однак ніщо не є повністю безпечним, і є кілька способів розбити шари шару.


Хоча ваша відповідь не помилкова, вона не відповідає на питання. Проблема тут полягає в тому, як безпечно передати пароль на сервер.
martinstoeckli

@martinstoeckli: Не обов'язково. Одноразовий пароль можна надіслати електронною поштою або смс. Це може бути використано для кожного запиту.
Sentinel

@Sentinel - хешування паролів здійснюється на стороні сервера, тому зловмисник не може отримати справжні паролі, якщо отримає збережені хеші. Якщо ви відправляєте одноразовий маркер на SMS користувачеві, немає ніякої переваги в обчисленні хеш-сторони клієнта. ManInTheMiddle міг просто використовувати хеш, і навіть коли він знає оригінальний маркер, він не міг використовувати його повторно.
martinstoeckli

-3

Якщо ви не можете використовувати HTTPS або не хочете використовувати HTTPS, розгляньте можливість використання jCryption . jCryption пропонує шифрування даних, що надсилаються через HTTP-запити (POST, GET тощо).

Ви можете протестувати техніку тут: http://www.jcryption.org/#examples

Якщо ви використовуєте Firebug, ви побачите, що всі дані зашифровані.

Він має бібліотеку jQuery для шифрування даних на інтерфейсі та бібліотеку PHP для дешифрування даних у фоновій частині.


1
JavaScript не можна використовувати для створення захищеного транспортного рівня: matasano.com/articles/javascript-cryptography
грак

Я повністю згоден, що це не на 100% безпека, але jCryption покладається на OpenSSL та один із декількох методів рукостискання. Усі дані, що надсилаються через HTTP-запит, зашифровані: ключі та значення повністю змінені / об’єднані тощо. Для шифрування використовується RSA та AES, і для використання jCryption потрібно створити відкритий та приватний ключ. Клацніть тут, щоб перевірити, як це працює
Віссам Ель-Кік

-4

Спробуйте це: На кожному запиті сторінки входу надсилайте nonce та мітку часу. Під час розміщення на сервері надішліть наступні чотири деталі:

Ім'я користувача, nonce та позначка часу у відкритому тексті. Потім з’єднайте вищезазначене з роздільником (Наприклад, новий рядок) і зашифруйте, використовуючи пароль користувача як шифрування в режимі ланцюгового блочного шифру.

На кінці сервера використовуйте ім'я користувача для пошуку пароля та перевірки зашифрованого рядка.

Оскільки пароль ніколи не надсилається чітко, він безпечний, і мітка часу може використовуватися, щоб уникнути повторної подачі тих самих даних.

Щоб уникнути викрадення сеансу шляхом отримання ключа сеансу за допомогою атаки "людина посередині", пароль або хеш пароля можна зберігати в пам'яті програмою на кінці клієнта і використовувати для генерації унікальних ключів сеансу для перевірки сервером.

Поглянути на OAuth 1.0 - теж непогана ідея.


1
Моя відповідь полягала в тому, щоб зробити логін безпечним. Отже, користувач вже повинен знати пароль.
Равіндра Х. В.

Я думаю, що використання мітки часу, хешованої з паролем, є цікавою ідеєю за умови, що сервер та браузер синхронізуються в часі. Не впевнений, чому це було проголосовано проти.
Дейв

@MaartenBodewes - До моменту, коли javascript отримає доступ до сховища довіри браузера, що дозволить реалізувати https на рівні програми, залишається єдиний варіант - забезпечити незалежний інтерфейс на https для скидання пароля.
Ravindra HV

Зараз я проголосував за це, тому що це просто вказує на те, що вам потрібно щось зашифрувати, не пояснюючи, як передається або обчислюється загальний секрет. Це не протокол, це купа цікавих ідей. Можливо, це корисно в довгостроковій перспективі, але це не відповідає на питання.
Maarten Bodewes

-4

Це важко забезпечити зв'язок без trusted third party, однак, є деякі прийоми безпеки для вас:

НЕ піддавайте конфіденційну інформацію користувачів загальнодоступній мережі.

Кожна конфіденційна інформація повинна бути добре хешована або зашифрована із відкритим ключем. Зверніть увагу: якщо ви вирішили зашифрувати конфіденційну інформацію користувачів за допомогою відкритого ключа, переконайтеся, що користувач може підтвердити відкритий ключ. Наприклад, ви можете надіслати користувачеві якийсь відбиток відкритого ключа за допомогою SMS або навіть за допомогою автоматичного дзвінка.

Після успішного входу створіть Спільну таємницю

Після безпечного журналу транзакції слід створити спільний секрет. Процедура генерації може посилатися на SSL Handshake. Зверніть увагу: як тільки загальний секрет буде сформовано, його потрібно буде більше транспортувати. Єдина його функція - шифрування / дешифрування даних між ServerтаBroswer

ПОВИННА бути двоетапна перевірка, щоб уникнути повторних атак

Нехай ці фокуси вам допоможуть

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.