Лекція 28. Керування паролями та SSL. Сесії

Керування паролями та SSL

SSL (Secure Sockets Layer – рівень захищених сокетів) – криптографічний протокол, який забезпечує встановлення безпечного з'єднання між клієнтом і сервером. SSL спочатку розроблений компанією Netscape Communications. Згодом на підставі протоколу SSL 3.0 був розроблений і прийнятий стандарт RFC, що отримав ім'я TLS.

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

Протокол SSL складається з двох підпротоколів: протокол SSL запису і рукостискання. Протокол SSL запису визначає формат, який використовується для передачі даних. Протокол SSL включає рукостискання з використанням протоколу SSL запису для обміну серіями повідомлень між сервером і клієнтом, під час встановлення першого з'єднання. Для роботи SSL потрібно, щоб на сервері був SSL-сертифікат.

SSL надає канал, що має три основні властивості:

  • Аутентифікація. Сервер завжди автентифікований, в той час як клієнт автентифікований в залежності від алгоритму.
  • Цілісність. Обмін повідомленнями включає в себе перевірку цілісності.
  • Конфіденційність каналу. Шифрування використовується після встановлення з'єднання і використовується для всіх наступних повідомлень.

У протоколі SSL всі дані передаються у вигляді записів-об'єктів, що складаються із заголовка і переданих даних. Передача починається із заголовка. Заголовок містить або два, або три байти коду довжини. Причому, якщо старший біт в першому байті коду дорівнює одиниці, то запис не має заповнювача і повна довжина заголовка дорівнює двом байтам, інакше запис містить заповнювач і повна довжина заголовка дорівнює трьом байтам. Код довжини запису не включає в себе число байт заголовка.

Тепер відправник «заповненого» запису додає заповнювач до наявних даних, і шифрує все це. Причому вміст заповнювача ніякої ролі не має. Через те, що обсяг переданих даних відомий, то заголовок може бути сформований з урахуванням Padding.

У свою чергу одержувач запису дешифрує все поле даних і отримує повну вихідну інформацію. Потім обчислюється значення RecLength за відомим Padding, і заповнювач з поля даних видаляється. Дані запису SSL складаються з трьох компонент:

  • MAC_Data [Mac_Size] — (Message Authentication Code) — код аутентифікації повідомлення
  • Padding_Data [Padding] — дані заповнювача
  • Actual_Data [N] — реальні дані

Коли записи надсилаються відкритим текстом, очевидно, що ніякі шифри не використовуються. Тоді довжина Padding_Data і MAC_Data дорівнюють нулю. При використанні шифрування, Padding_Data залежить від розміру блоку шифру, а MAC_Data залежить від вибору шифру. Приклад обчислення MAC_Data:

MacData = Hash (Secret, Actual_Data, Padding_Data, Sequence_Number);

Значення Secret залежить від того, хто (клієнт або сервер) посилає повідомлення. Sequence_Number — лічильник, який інкрементується як сервером, так і клієнтом. Тут Sequence_Number є 32-х бітовий код, який передається хеш-функції у вигляді 4-х байт, причому першим передається старший байт. Для MD2, MD5 MAC_Size дорівнює 16 байтам (128 бітам). Для 2-х байтового заголовка максимальна довжина запису дорівнює 32767 байтам, а для 3-х байтового заголовка 16383 байти.

Значне використання протоколу SSL призвело до формування протоколу HTTPS (Hypertext Transfer Protocol Secure), що підтримує шифрування. Дані, які передаються по протоколу HTTPS, «упаковуються» в криптографічний протокол SSL або TLS, тим самим забезпечуючи захист цих даних. Такий спосіб захисту широко використовується у світі Веб для додатків, в яких важлива безпека з'єднання, наприклад у платіжних системах. HTTPS підтримується всіма браузерами. На відміну від HTTP, для HTTPS за замовчуванням використовується TCP-порт 443.

Спочатку віртуальні приватні мережі (VPN) на основі SSL розроблялися як додаткова і альтернативна технологія віддаленого доступу на основі IPsec VPN. Однак, такі фактори як достатня надійність і дешевизна зробили цю технологію привабливою для організації VPN. Також SSL отримав широке застосування в електронній пошті.

Основні цілі протоколу в порядку пріоритетності:

  • Криптографічна безпека: SSL встановлює безпечне з'єднання між двома сторонами.
  • Відкритість: Програмісти, незалежно один від одного, можуть створювати додатки, що використовують SSL, які згодом будуть здатні успішно обмінюватися криптографічними параметрами без всякого знання коду чужих програм.
  • Розширюваність: SSL прагне забезпечити робочий простір, в якому нові відкриті ключі і трудомісткі методи шифрування можуть бути додані при необхідності.
  • Відносна ефективність: робота протоколу на основі SSL вимагає великих швидкостей від CPU, зокрема для роботи з відкритими ключами. Тому до SSL протоколу була включена необов'язкова схема кешування сесій для зменшення кількості з’єднань, які необхідно встановлювати з нуля. Крім того, велика увага приділяється тому, щоб зменшити мережеву активність.

SSL підтримує 3 типи аутентифікації:

  • Аутентифікація обох сторін (клієнт-сервер),
  • Аутентифікація сервера з нерозпізнаних клієнтом
  • Повна анонімність.

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

Головна мета процесу обміну ключами – це створення секрету клієнта (pre_master_secret), відомого тільки клієнту і серверу. Секрет (pre_master_secret) використовується для створення спільної таємниці (master_secret). Загальний секрет необхідний для того щоб створити повідомлення для перевірки сертифіката, ключів шифрування, секрету MAC (message authentication code) і повідомлення «finished». При посилці вірного повідомлення «finished», тим самим сторони доведуть що вони знають вірний секрет (pre_master_secret).

Сесії

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

Сесії використовують просту технологію. Коли сесія створена, PHP буде або отримувати існуючу сесію, використовуючи переданий ідентифікатор (зазвичай із сесійної cookie) або, якщо нічого не передавалося, буде створена нова сесія. PHP заповнить суперглобальну змінну $_SESSION сесійною інформацією після того, як буде запущена сесія. Коли PHP завершує роботу, він автоматично серіалізує вміст суперглобальної змінної $_SESSION і відправить для збереження, використовуючи сесійний обробник для запису сесії.

За замовчуванням PHP використовує внутрішній обробник files для збереження сесій, який встановлений в INI-змінної session.save_handler. Цей оброблювач зберігає дані на сервері в директорії, зазначеній в конфігураційній директиві session.save_path.

Сесії можуть запускатися вручну за допомогою функції session_start(). Якщо директива session.auto_start встановлена в 1, сесія автоматично запуститься, на початку запиту.

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

Реєстрація змінної за допомогою $_SESSION:

session_start();

if (!isset($_SESSION['count'])) {

  $_SESSION['count'] = 0;

} else {

  $_SESSION['count']++;

}


Остання зміна: Thursday 28 May 2020 20:26 PM