Шифрування даних на php

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

Шифрування буває двох видів: односпрямоване - коли дані можна тільки зашифрувати, а розшифрувати не можна (наприклад, шифрування md5) і двунаправленное - коли є можливість, як зашифрувати, так і розшифрувати дані. В даному уроці ми будемо використовувати двунаправленное шифрування. Для роботи з шифруванням в мові PHP розроблено розширення під назвою mcrypt, яке дозволяє шифрувати дані використовуючи різні алгоритми шифрування (шифри).

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

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

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

Шифрування даних на php

Шифрування даних на php

Шифрування даних на php

Тепер давайте приступимо до шифрування даних.

шифрування даних

Для початку давайте створимо невелику форму для введення тексту, що підлягає шифрування:

Як Ви бачите - це звичайна форма і в браузері вона відображається ось так:

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

ВАЖЛИВО. Якщо даний ключ буде втрачено, то дані розшифрувати Ви вже не зможете.

Даний ключ можна зберігати в файлі конфігурації, головне, що б до нього, крім Вас, ні хто не мав доступу. Так як у нас немає конфігураційного фала, то я створю даний ключ всередині файлу index.php:

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

Далі необхідно відкрити модуль mcrypt:

Для цього застосовуємо функцію mcrypt_module_open, яка відкриваємо модуль mcrypt, для початку процесу шифрування. Параметри передаються функції:

MCRYPT_BLOWFISH - алгоритм шифру;

»- якщо алгоритм не стандартний, то в цьому параметрі вказуємо шлях до алгоритму шифрування;

MCRYPT_MODE_CFB - режим шифрування;

»- якщо режим шифрування не стандартний, то в цьому параметрі вказуємо шлях до режиму шифрування.

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

Як Ви бачите для визначення довжини вектора ініціалізації, використовується функція mcrypt_enc_get_iv_size (), параметром якої необхідно передати дискриптор відкритого модуля mcrypt. Тепер, необхідно створити даний вектор:

Функція mcrypt_create_iv (), створює вектор ініціалізації. Параметри, які необхідно передати: $ iv_size - довжина вектора, MCRYPT_RAND - режим отримання вектора ініціалізації, в нашому випадку це генерація вектора випадковим чином. Далі для початку шифрування даних, необхідно відкрити буфер обміну:

Функція mcrypt_generic_init () - відкриває буфер обміну, який необхідний для процесу шифрування. Параметрами необхідно передати наступні значення:

$ Td - дискриптор відкритого модуля mcrypt;

$ Key - секретний ключ, який необхідний як для шифрування даних, так і для їх розшифровки;

$ Iv - вектор ініціалізації.

Тепер можна зашифрувати дані:

Для цього використовуємо функцію mcrypt_generic (), яка власне і шифрує дані, за обраним алгоритмом і режиму шифрування. Параметрами передаємо наступні значення: $ td - дискриптор відкритого модуля mcrypt; $ Str - рядок, яку необхідно зашифрувати. І не забуваємо закрити відкритий буфер обміну і модуль mcrypt:

Тепер до зашифрованої рядку додамо, отриманий спочатку вектор ініціалізації і виведемо зашифрований текст на екран. Але перед виведенням на екран, опрацюємо рядок функцією base64_encode (), інакше на екрані ми побачимо множина не Новомосковскемих символів.

Тепер давайте введемо в текстову форму рядок hello world і подивимося що у нас вийшло:

Шифрування даних на php

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

розшифровка даних

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

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

Як Ви бачите, просто вирізаємо частина рядка, від нуля, до значення змінної $ iv_size1 (довжина вектора ініціалізації). Потім отримуємо рядок з даними:

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

B викликаємо функцію розшифровки даних:

Ця функція розшифровує дані. Параметрами необхідно передати наступні значення: $ td - дискриптор відкритого модуля; , $ Crypt_text1 - рядок з зашифрованими даними. Потім закриваємо буфер обміну, відкритий модуль mcrypt і виводимо результат на екран:

Давайте в текстове поле введемо все ту ж рядок "hello world" і подивимося на результат:

Шифрування даних на php

Як Ви бачите все успішно працює. Про всяк випадок приведу повний текст скрипта:

На цьому даний урок можна завершувати. Всього Вам доброго, вдалого кодування! І побачимося в наступних уроках!

Найсвіжіші новини IT і веб-розробки на нашому Telegram-каналі