Хотів би відразу зазначити, що шифрування - це досить складна наука і звичайно за один урок ми з Вами не зможемо розглянути всі досконально. Але, ми розглянемо - основу, тобто, як реалізувати механізм шифрування, використовуючи відкритий і закритий ключ.
Отже, системи шифрування з відкритим і закритим ключем були придумані ще в 70-х рр. Тобто - це були системи, які забезпечують передачу зашифрованих повідомлень, для розшифровки яких необхідно було використовувати ключ, відмінний від ключа шифрування. Це була головна відмінність нових систем від старих, в яких використовувався лише один ключ - для шифрування і розшифровки повідомлення.
У системах шифрування з відкритим ключем використовується скрипт, шифрує дані за допомогою відкритого ключа. Відкритий ключ - це шифр, який безпосередньо виступає інструкцією щодо шифрування повідомлення. Відкритий ключ створюється скриптом шифрування, і для кожного користувача він свій - унікальний.
Фреймворк YII2. Швидка розробка з сучасним PHP фреймворком
Дізнайся тонкощі сучасної веб-розробки за допомогою фреймворка YII2
Після того, як повідомлення зашифровано, його можна розшифрувати тільки за допомогою закритого ключа.
Зверніть увагу на малюнок (вище) - це схема роботи системи шифрування з відкритим і закритим ключем.
Отже, наприклад Вам необхідно відправити шифрування повідомлення певному користувачеві. Для початку необхідно отримати відкритий ключ від цього користувача. Отримавши даний ключ, Ви використовуючи скрипт шифрування - шифруєте повідомлення і відправляєте його користувачеві. Для дешифрування повідомлень користувач використовує свій закритий ключ. При цьому для розшифровки повідомлення вже не можна скористатися відкритим ключем. Це означає, що тільки одержувач повідомлення зможе прочитати повідомлення, використовуючи свій закритий ключ.
Таким чином, закритий ключ в поєднанні зі скриптом шифрування використовується для дешифрування повідомлення, зашифрованого за допомогою відкритого ключа користувача. Без знання закритого ключа дешифрувати зашифрований файл неможливо.
Що потрібно для роботи
У сьогоднішньому уроці для реалізації механізму шифрування ми будемо використовувати розширення мови PHP - OpenSSL.
Взагалі OpenSSL - це система захисту і сертифікації даних. SSL перекладається, як система безпечних сокетів (secure socket layer). OpenSSL використовується практично всіма мережевими серверами для захисту переданої інформацією і це досить складна і велика система. У сьогоднішньому уроці ми розглянемо тільки ті моменти, які зачіпають шифрування даних.
Після цього не забудьте перезапустити веб-сервер. Якщо ж Ви використовуєте пакет denwer, в його базовому варіанті, то, швидше за все даного розширення у Вас немає. Вам необхідно скачати і встановити пакет розширень для Вашої версії denwer (даний пакет можна завантажити з офіційного сайту).
генерація ключів
Отже, перш за все, необхідно згенерувати ключі. Для цього ми створимо файл Enc.class.php і створимо клас, який буде логічним ядром нашого скрипта:
В даному в класі створюємо статичний метод get_keys (), який ми будемо використовувати для генерації ключів і збереженні їх в текстових файлах (мається на увазі, що даний метод буде викликаний всього один раз - для генерації і запису ключів в текстові файли). Першим справу створюємо масив, конфігов, тобто задаємо настройки при створенні закритого ключа:
Вказуємо тип ключа OPENSSL_KEYTYPE_RSA (закритий ключ для шифрування відкритим і закритим ключем) і розмір в бітах майбутнього ключа (512 біт). Далі генеруємо закритий ключ і повертаємо його дескриптор:
Витягнемо значення ключа з його дескрітпора:
Функція openssl_pkey_export () - повертає закритий ключ у вигляді рядка і даний рядок зберігається в змінній $ privKey, яка передається другим аргументом цієї функції. Перший параметр - це дескриптор ключа. Тепер давайте створимо файл index.php і виведемо на екран значення змінної $ privKey (в методі get_keys () я тимчасово повертаю до секретного ключа):
Ось що ми побачимо на екрані:
Фреймворк YII2. Швидка розробка з сучасним PHP фреймворком
Дізнайся тонкощі сучасної веб-розробки за допомогою фреймворка YII2
Потім зберігаємо отриманий ключ в текстовий файл.
Тепер якщо ще раз оновити скрипт, то ми побачимо що створився текстовий файл в якому збережений закритий ключ. Далі необхідно згенерувати відкритий ключ. Для цього створимо запит для сертифіката - CSR (Certificate Signing Request). Який представляє собою зашифрований текст, що містить інформацію про компанію, доменному імені і т.д. Даний запит необхідний для придбання SSL сертифікату, який видається центрами сертифікації. Що б створити запит CSR, необхідно створити масив з наступними даними:
«CountryName» => «UA» - двозначний код країни;
«StateOrProvinceName» => «Kievskaya Oblast» - регіон чи область;
«LocalityName» => «Kiev» - місто;
«OrganizationName» => «Organization» - ім'я компанії;
«OrganizationalUnitName» => «Soft» - назва відділу;
«CommonName» => «localhost» - доменне ім'я;
Далі створюємо запит CSR:
Зверніть увагу, що необхідно передати функції openssl_csr_new (), раніше створений масив і закритий ключ. Далі створюємо сертифікат:
Функція openssl_csr_sign - поверне дескриптор створеного сертифіката. Їй необхідно передати наступні параметри: $ csr- запит csr, NULL - позначає, що отриманий сертифікат буде самостійно згенерував сертифікатом, $ privKey - закритий ключ, 10 - час актуальності сертифіката в днях. Функція openssl_x509_export () - витягне з дескриптора $ cert сертифікат і збереже його в змінній $ str_cert. Далі, генеруємо відкритий ключ:
Функція openssl_pkey_get_public () повертає дескриптор відкритого ключа (на основі отриманого раніше сертифіката), а функція openssl_pkey_get_details () повертає масив, в якому в осередку key, міститься відкритий ключ. Давайте подивимося, як він виглядає:
Далі записуємо відкритий ключ в файл і повертаємо масив з отриманими ключами:
шифрування даних
Для шифрування даний додамо метод my_enc ():
Як Ви бачите, тут ми читаємо відкритий ключ з текстового файлу і викликаємо функцію openssl_public_encrypt (), яка шифрує дані відкритим ключем. Параметри, який необхідно їй передати: $ str - рядок для шифрування; $ Result - змінна в яку будуть збережені результати і $ pub_key - публічний ключ.
дешифрування даних
Як завжди створюємо новий метод:
Насамперед отримуємо закритий ключ з текстового файлу і викликаємо функцію openssl_private_decrypt (), яка дешифрує дані закритим ключем. Параметри, які необхідно їй передати $ str - рядок для дешифрування, $ result змінна в яку буде збережений результат, $ pr_key - закритий ключ.
Перевірка роботи скрипта
Тепер давайте допишемо код файлу index.php, а саме створимо рядок для шифрування і викличемо послідовно методи my_enc (), для шифрування і my_dec () для дешифрування (приведу повний код файлу index.php):
Тепер давайте подивимося, що у нас вийшло:
Як Ви бачите все успішно відпрацювало. На цьому даний урок завершено. Всього Вам доброго і вдалого кодування.
Фреймворк YII2. Швидка розробка з сучасним PHP фреймворком
Дізнайся тонкощі сучасної веб-розробки за допомогою фреймворка YII2
Найсвіжіші новини IT і веб-розробки на нашому Telegram-каналі