Аутентифікація API, одноразовий маркер VS Dynamic маркери


13

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

Перша пропозиція: (Одноразовий маркер AKA Static Token)

  1. клієнт запитує основний маркер, надсилаючи ім'я користувача та пароль та current_time (ця змінна буде збережена в базі даних сервера і клієнтській стороні) до api, сервер інтерпретує введення та видає хешований маркер (наприклад: 58f52c075aca5d3e07869598c4d66648) зберігає його в базі даних і повертає клієнту.

  2. Тепер клієнт зберігає основний маркер і створює новий хеш-маркер за допомогою основного маркера + змінної current_time, що надсилається в запиті аутентифікації (дозволяє викликати цей новий маркер, main_token), також сервер робить те саме і створює той же маркер за допомогою того ж алгоритму .

  3. Кожен раз, коли клієнт запитує API сервера, він надсилає сервер main_token, тепер сервер порівнює токен, що генерується в ньому, з головним_токеном, надісланим клієнтом, якщо він відповідає, це означає, що користувач справжній

Друга пропозиція: (Динамічний маркер)

  1. Клієнт генерує два випадкових ключа ($ key1 = rand (10000,90000); $ key2 = rand (10000,90000);) У кожному запиті в API клієнт створює хеш, використовуючи тип запиту, і два ключі з складний алгоритм і надсилає ці два ключі + хеш на сервер

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


Тепер питання полягає в тому, який з них є найбільш логічним та безпечним способом використання для захисту запитів API?


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

1
Можливо, мені щось не вистачає ... але чому б не використовувати OAuth як механізм аутентифікації? Це стандартно, і для ваших клієнтів будуть бібліотеки, якими можна користуватися майже на кожній мові.
Icode4food

Відповіді:


14

Мені дуже подобається перший підхід загалом.

  • це просто зрозуміти та реалізувати
  • це безпечно (наскільки мені відомо)
  • це не рідкість підходу, який я бачив, як застосовувався в минулому

Одне, що я не бачу згадати про перше, про що слід пам’ятати, для часової позначки, яка використовується для хешування маркера, має бути термін TTL, який є надзвичайно коротким (як 1 секунда), щоб ви переконалися, що повідомлення не було надіслано таку ж мітку часу та маркер із повідомлення на 12 годин раніше; Очевидно, це було б обчислено як законний, але це не в цьому випадку.

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

Зверніть увагу, я не є експертом з безпеки.


OAuth / Federated

У такому підході у вас є сторона-гарант, де споживчий код запитує маркер / cert / що у вас від них і передає вам це, в цей момент все, що вам потрібно зробити, - це запитати третьої сторони, чи надано вам ключ законний.

Про:

  • На основі стандартів
  • Проблеми знайдуть інші в системах інших людей, тож ви дізнаєтесь, чи станеться невпевненість у собі
  • Набагато менше авторських робіт вам знадобиться

Con:

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

Асинхронні сертифікати

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

від Novell (так я знаю, novell? дійсно?)

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

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

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

Про:

  • Сертифікати мають коріння CA, які роблять їх надійними і важко підробляти
  • В операційних системах є стандартні засоби для легкого управління та обслуговування магазинів cert
  • Добре вивчений підхід, багато інформації про нього
  • Термін дії, а також різноманітні інші речі - це вбудовані засоби стандартних сертифікатів, вони, як правило, надійні

Con:

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

NTLM

Не смійтесь, якщо це лише менша або внутрішня послуга, і ви перебуваєте в середовищі Windows, немає нічого поганого в тому, щоб використовувати стандартну автентифікацію NTLM для гарантування доступу. Особливо, якщо ви працюєте з IIS, це найпростіший підхід. Легко обслуговувати та налаштовувати, а також у web.config.

Про:

  • Надзвичайно простий у налаштуванні, реалізації та обслуговуванні

Con:

  • Мінімальна сумісність
  • Недостатньо для публічної автентифікації

Нюші

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

Про:

  • Thwarts відтворюють атаки досить добре
  • Загалом не важко втілити чи зрозуміти

Con:

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

Я підозрюю, що TTL може знадобитися довше секунди, хоча й коротшою за хвилину (припускаючи HTTP / HTTPS як транспорт). TTL залежить від затримки транспорту (тобто набагато довше для електронної пошти, ніж для прямого з'єднання).
стипендіати доналу

1
Ви забули керберос . І я б висунув надзвичайно сильне застереження проти прокатки вашого власного пакету аутентифікації / токенів, як підказує питання. RYO auth дуже легко помилитися; прикладом може бути використання пробілу ключових сівби лише 80 000 5-значних числових значень (з другого випадку ОП). Ви також повинні бути обережними у використанні хешей (з 1-го випадку). Зараз багато хто банально відривається від пошуку веселкових столів.

1
Дуже дякую вам за відповідь. Я перейшов з цього проекту, але це питання я залишатиму улюбленим. Вибачте, що я не прийняв вашу відповідь, оскільки вона дуже ґрунтовна. Але що з того, щоб Novell була поганою? :(
SAFAD

@SAFAD нічого поганого щодо Novell, мене просто кинули, коли шукали ресурси щодо деталей безпеки, що я знайшов щось нове від Novell, я вважав, що компанія вимерла з віками назад. давно зараз. Я все одно оцінюю прийняття, оскільки Глен вище зазначає, що це може бути більш ретельним, але я намагався дати спрощений огляд нормальних підходів. Керберос - це досить великий нагляд і хороший вибір. Можливо, я додам це зараз ..
Джиммі Хоффа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.