Лесно шифроване Как да интегрирате защитено криптиране
Интегрирането на криптирането във вашето собствено приложение е често желание на разработчиците. Тази статия има за цел да предостави кратко въведение в тази невероятно сложна тема. За съжаление няма сребърен куршум за сигурно криптиране на данни.

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