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

Шифрування, але правильно
Перш ніж навіть подумати про те, як технічно зашифрувати та які алгоритми використовувати, вам слід зробити крок назад. Інтеграція безпечного шифрування у ваш власний додаток є менш технічним, а більше концептуальним питанням.
Перше запитання, на яке потрібно відповісти: Які дані я хочу від кого захистити? Відповідь на це питання є абсолютною основою, без якої неможливо використовувати безпечний метод шифрування.
З одного боку, має бути чітко визначено, які дані слід шифрувати. Спочатку це звучить як просте запитання, але це зовсім не так. Приклад: Ви розробляєте Інтернет-магазин або CRM-систему і хочете зашифрувати дані клієнтів. Спочатку чудово звучить. Але як ви маєте намір обробляти ці дані тоді? Як ви хочете знову знайти ці дані - пошук зашифрованих даних спочатку неможливий.
Від кого я хочу захистити дані?
Після того, як ви визначили, які дані слід шифрувати, виникає наступне запитання: від кого я хочу захищати дані?
Наступні приклади призначені для демонстрації обсягу цього питання. Ви хочете захистити дані доступу до бази даних вашої програми. Сценарій полягає в тому, що зловмисник знаходить слабке місце у вашому додатку і може читати будь-які локальні дані. Якщо він використовує її для завантаження конфігурації, він, принаймні, не повинен мати даних доступу до бази даних безпосередньо. Тому зрозуміло, що шифрування та дешифрування повинно відбуватися на стороні сервера. Без даних доступу ваша програма не може отримати доступ до сервера баз даних.
Інший приклад: Ви хочете захистити дані від своїх адміністраторів, оскільки ви працюєте з безпечною службою обміну повідомленнями. Це означає, що шифрування та дешифрування має відбуватися на клієнті. Альтернативне рішення, як я вже бачив у тесті на проникнення, що дані надсилаються на сервер, а це потім шифрує або розшифровує, у цьому випадку не допомагає. Дані доступні у вигляді простого тексту на сервері, навіть якщо вони є лише в основній пам’яті.
Важливі питання, щоб знайти правильну архітектуру шифрування
Ми вже зверталися до найважливішого питання: "Які дати"і з яких. "Чому"Потім знову пов'язане з" ким ". Це можна використовувати для уточнення "Де“Шифрування має відбутися.
Як тільки все це буде з'ясовано, ви можете присвятити себе технічному впровадженню, тобто "Як".
Шифрування реалізовано надійно
Як уже зазначалося, технічні деталі шифрування обговорюються в цій статті. Управління ключами - це окрема, дуже складна тема, яка буде розглянута в наступній статті в блозі.
У цьому розділі я хотів би попросити вас спершу: Не створюйте власний метод шифрування. Одного разу Брюс Шнайєр добре це узагальнив (тепер відомий як Закон Шнайера), який я хотів би перекласти дуже вільно:
Будь-хто може розробити настільки розумне шифрування, що ви не можете його зламати самостійно. Завдання полягає в тому, щоб розробити такий, який ніхто не зможе зламати навіть після багатьох років аналізу.
На жаль, ми вже провели багато аудитів, під час яких замовники розробляли власну криптосистему, і, на жаль, вона жодного разу не завоювала цього імені.
Другий важливий момент - якщо ви вирішите використовувати існуючий алгоритм, не застосовуйте його самостійно. Практично неможливо продумати всі атаки бічних каналів та інші атаки, які можуть зробити шифрування марним.
Сіль у супі: натрій
На щастя, сьогодні існують бібліотеки, які можуть зробити для вас багато роботи, коли справа стосується використання шифрування. Команда під керівництвом Даніеля Дж. Бернштейна, Таня Ланге та Пітера Швабе зробила великий крок, коли запустила проект NaCl (вимовляється як сіль). NaCl надає безліч функцій, необхідних для захищеної криптосистеми. На основі цього була розроблена бібліотека "libsodium", що робить її портативною та робить доступною майже для всіх доступних мов програмування. Дуже дозвільна ліцензія ISC також дозволяє використовувати у всіх проектах, навіть якщо вони комерційні (увага, обгортки для певних мов програмування можуть використовувати різні ліцензії).
Що лібонатрій робить для вас
Навіть коли у вас є принципово захищений алгоритм, надзвичайно складно його надійно впровадити. З одного боку, є атаки бічних каналів. Атака не відбувається безпосередньо на шифруванні, але робляться спроби зробити висновки щодо простого тексту або ключа, що використовується через об'їзд. libsodium вже враховує цю опцію, тому розробникам не доводиться про це турбуватися.
Навіть такі складні проблеми, як заповнення та автентифікація, повністю вирішуються за допомогою лібонатрію. Прокладка завжди потрібна для блочних шифрів, оскільки вони можуть працювати лише цілими блоками. Наприклад, з AES це завжди 16-байтові блоки. Якщо дані, що підлягають зашифруванню, мають лише 8 байт, решту 8 байт необхідно заповнити. Ще однією складністю є автентифікація при шифруванні. У цьому контексті аутентифікація означає можливість розпізнавання маніпуляцій із зашифрованим текстом (зашифрованими даними). Наприклад, сам AES не пропонує інтегрованої автентифікації; це додається лише в режимі шифрування GCM.
У поєднанні: Проблеми з заповненням та відсутністю автентифікації можуть призвести до того, що звичайний текст можна відновити, оскільки оракул для заповнення може бути можливим.
До речі, це лише невеликий уривок з того, що ви можете зробити неправильно з криптовалютою. На щастя, libsodium опікується всіма проблемами шифрування.
Встановлення лібонатрію
libsodium можна скласти самостійно на всіх платформах. Існують також готові бібліотеки DLL для Windows. На жаль, вони не підписані цифровим способом, тому вам доведеться перевіряти DLL-файли самостійно.
Шкода, що розробники справді підписують PGP, але ключ можна знайти лише на домашній сторінці, і його не автентифікували інші. В іншому випадку інструмент Minisign все ще можна використовувати, завдяки чому вам доведеться довіряти ключу, даному на домашній сторінці.
Однак важливо, щоб перевірка відбулася! Найкраща криптобібліотека, звичайно, ні до чого, якщо вона була підготовлена і, наприклад, створює невдалий збіг або інтегрує інший бэкдор.
Усі прив'язки для інших мов програмування базуються на натрію, тобто використовують DLL або спільний об'єкт. Тому файл слід інтегрувати перед використанням. Те, як це працює, різниться залежно від мови програмування, але дуже добре описано в окремих проектах.
Що тепер далі?
Наступний крок - ознайомитись із прив’язками відповідної мови програмування та трохи пограти. Коротке зауваження: якщо документація до одного переплетення погана, просто візьміть інше. Наприклад, в Java існує безліч бібліотек, але деякі з них краще обслуговуються і, перш за все, документуються.
В основному, однак, я хотів би зробити такі коментарі:
Не залишайте нічого на волю випадку, або принаймні?
Хороше шифрування вимагає криптографічно безпечного шансу. libsodium використовує внутрішні функції операційної системи для генерації випадкових даних, саме тому ви можете впевнено довіряти випадковій функції (наприклад, randombytes_buf).
Примітки щодо симетричного шифрування
При симетричному шифруванні залишається сказати, що не слід використовувати ключ більше одного разу. Nonce - що походить від "не більше одного разу" - може використовуватися лише один раз (!). Генеруйте нове нонс знову і знову, використовуючи функцію випадкових випадків.
Якщо ви використовуєте функцію високого рівня для шифрування, libsodium використовує XSalsa20 Stream Cipher для шифрування та Poly1305 для автентифікації станом на жовтень 2017 року. Існує також можливість використовувати AES-GCM. Це може бути перевагою, якщо вам потрібно відповідати певним критеріям. Цей алгоритм не використовується як стандарт, оскільки він доступний лише в тому випадку, якщо центральний процесор підтримує інструкції AES-NI.
Асиметричне шифрування
Завдяки асиметричному шифруванню, libsodium пропонує функції для генерації пар ключів і - як уже зазначалося вище - дбає про заповнення та автентифікацію. Використаними алгоритмами (станом на жовтень 2017 р.) Є X25519 для ключа, потоковий шифр XSalsa20 для шифрування та Poly1305 для автентифікації.
Хешування
Функції хешування, які пропонує лібонатрій, дозволяють просте хешування, тобто одне і те ж введення веде до одного і того ж виводу або комбінація з паролем для сценарію HMAC. Використовуваний алгоритм (станом на жовтень 2017 р.) BLAKE2b є одним із фіналістів SHA-3.
пароль
Про це ми писали у своїй статті про безпечне зберігання паролів. На щастя, libsodium вже надає відповідні функції для безпечного зберігання паролів. У стандартній реалізації поточна версія лібонатрію використовує Argon2.
світогляд
Ми розглянемо це критичне питання більш докладно протягом наступних кількох тижнів. Мета полягає в тому, щоб ви дізналися, як найкраще використовувати лібонатрій, і щоб ви могли реально інтегрувати безпечне шифрування у свою програму. Якщо це трохи гостріше, ми, звичайно, можемо також порадити вам безпосередньо. Ми також з нетерпінням чекаємо вашого відгуку!