Ця стаття є перекладом тексту Dru Lavigne.

В цій і декількох наступних статтях я розповім про шифрування даних, переданих по комп’ютерним мережам. Якщо ви пам’ятаєте цикл статей, присвячених обговоренню IP-пакетів (див. www.onlamp.com/pub/a/bsd/2001/03/21/FreeBSD_Basics.html), то ви вже знаєте, що переважна більшість даних передається по мережах у відкритому вигляді, легко перехватываемом зловмисником за допомогою сніффер. Така ситуація може бути неприйнятна у разі передачі користувальницьких імен, паролів і деякої іншої важливої інформації. На щастя, існують так звані криптосистеми (криптографічні системи), призначені для захисту переданих у мережі даних від сторонніх очей.

Для того що б правильно сконфігурувати криптосистему, вам необхідно добре знати використовуються ними алгоритми і правильну термінологію. Ця стаття являє вступний експрес-курс криптографічну термінологію. У наступних статтях я розповім вам про конфігуруванні декількох конкретних криптосистем надаються FreeBSD.

Отже, що ж таке криптосистеми і чому вам треба їх використовувати? Криптосистема це набір програм, які, використовуючи сукупність алгоритмів надають користувачу три речі: конфіденційність, цілісність та автентичність. Кожна з них важлива сама по собі, тому давайте розберемося з ними по черзі.

Приватність
Функція приватності гарантує, що потік переданих даних зможе «зрозуміти» тільки їх одержувач. Навіть якщо пакет з даними буде перехоплений сниффером, він не зможе розшифрувати вміст повідомлення. Криптосистеми використовують алгоритми шифрування (шифри) для кодування переданого «чистого» тексту в шифротекст перед передачею його в мережу. Для розшифровки прийнятого шіфротекста одержувач використовує спеціальний ключ. Відправник і одержувач повинні використовувати один і той же ключ як для шифрування, так і для дешифрування даних. Зрозуміло, що для забезпечення приватності даних найважливіше значення має секретність ключа і його наявність тільки у відправника й одержувача, оскільки за допомогою ключа будь-який бажаючий може розшифрувати шифротекст (як і зашифрувати, що часто є не менш небезпечним прим. перекладача).

Може трапитися, що хтось розшифрує дані за допомогою злому (підбору) ключа. Під стійкістю шифрувального алгоритму розуміється складність злому його ключа. Зазвичай складність злому пропорційна довжині ключа. Довжина ключів вимірюється в бітах. Наприклад, що б зламати ключ 56-бітного алгоритму зазвичай потрібно набагато менше часу, ніж що б зламати ключ 256-бітного.

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

Існує ряд інших міркувань, які слід враховувати при виборі алгоритму шифрування. Деякі алгоритми запатентовані та їх застосування потребує ліцензування. Застосування деяких алгоритмів дозволено лише в деяких областях діяльності. Деякі алгоритми занадто легко зламуються або компрометируются. Швидкість роботи різних алгоритмів часто сильно відрізняється незалежно від розміру ключа. Наприклад, DES і 3DES вважаються повільними, а Blowfish дуже швидким незважаючи на велику довжину ключа.

Існують законодавчі обмеження на використання тих чи інших алгоритмів, які істотно відрізняються від країни до країни. (Варто зазначити, що на території Російської Федерації офіційно дозволено застосування лише криптографічних засобів сертифікованих ФАПСИ. Пояснюється це турботою про безпеку громадян, оскільки завжди існує ймовірність існування в алгоритмах так званих «закладок», за допомогою яких їх творці легко можуть розшифрувати шифротекст без володіння секретним ключем. Наскільки вільні від «закладок» алгоритми пропоновані російськими спецслужбами, можна тільки здогадуватися, спираючись на численні свідоцтва чистоти їхніх рук прим. перекладача.)

Деякі країни ввели експортні обмеження. Це означає, що всередині країни дозволяється застосовувати сильну криптографію з великою довжиною ключа, але як тільки одержувачем інформації стає особа перебуває за межами країни, законослухняний відправник повинен використовувати менш сильні алгоритми з меншою довжиною ключа. Сполучені Штати Америки обмежують вивіз криптографічних алгоритмів з довжиною ключа більше 40 біт (зараз це обмеження кілька пом’якшено прим. перекладача), ось чому деякі алгоритми підтримують лише скромні ключі розміром 40 біт. (Зрозуміло у волелюбного інтернет – і користолюбного бізнес-спільноти є м’яко кажучи інший погляд на дану проблему. Тому ситуація з плином часу здається, змінюється на користь дозволу на застосування сильної криптографії. Обговорення питань застосування сильної криптографії присвячений не один номер паперової Комп’ютери. прим. перекладача.)

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

У цій таблиці порівнюється декілька алгоритмів про яких ви могли чути. Алгоритм Розмір ключа Запатентований Коментар
DES 56 повільний, легко розкривається
3DES 168 повільний
Blowfish 32 — 448 немає надзвичайно швидкий
IDEA 128 так
CAST 40 — 128 так
Arcfour 40, 128
AES (Rijndael) 128, 192, 256 немає швидкий
Twofish 128, 256 немає швидкий

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

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

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

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

Подібний порядок згадки алгоритмів в таблиці не випадковий. Стосовно до криптографічних контрольних сум алгоритм MD4 дає найменшу надійність, а SHA-1 найбільшу. Завжди обирайте найбільш надійну хеш-функцію доступну у вашій системі.

Слід згадати ще про один речі, що має відношення до криптографічних хеш-функцій, це так званий HMAC (Hash-based Message Authentication Code хешевый код ідентифікування повідомлень), при використанні HMAC для генерації контрольної суми використовується шифрувальний ключ. Це корисно, оскільки неможливо створити контрольну суму без доступу до ключа. Якщо при генерації контрольної суми використовується HMAC, то про це повідомляється додаванням абревіатури «HMAC» перед назвою алгоритму хеш-функції. Наприклад, HMAC-MD4 дає більшу безпеку ніж MD4, а HMAC-SHA більшу ніж просто SHA. Якщо знову відсортувати алгоритми в порядку підвищення їх надійності, то вийде наступний список:

MD4
MD5
SHA
SHA-1
HMAC-MD4
HMAC-MD5
HMAC-SHA
HMAC-SHA-1
Автентичність
Отже, у нас є впевненість, що дані зашифровані і що на етапі передачі у них не можна буде внести зміни. Однак наші зусилля пропадуть дарма, якщо дані, або, тим більше ключ, помилково будуть відіслані тому адресатові. У такій ситуації в гру вступає третій компонент криптосистеми аутентифікація (автентифікація).

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

Для цього необхідний інший клас алгоритмів шифрування, відомі як алгоритми шифрування з асиметричними ключами (алгоритми шифрування з відкритим ключем). Назва «асиметричні» походить з того, що відправник і одержувач повідомлення для вирішення своїх завдань не користуються одним і тим же ключем. Навпаки, і відправник, і одержувач окремо один від одного генерують пари ключів, які складаються з двох ключів пов’язаних математичною залежністю (по-російськи кажучи це означає, що ключі обчислюються за допомогою якої-небудь функції прим. перекладача). Один з цих ключів, публічний (відкритий), що підлягає обміну. Таким чином, і одержувач і відправник обмінюються своїми відкритими ключами. Інший ключ, званий секретним, повинен зберігатися в таємниці. Безпека системи залежить від збереження у таємниці саме секретного ключа. Якщо секретний ключ скомпрометований (розкритий), зацікавленим сторонам слід негайно відкликати скомпрометовані пари і згенерувати нові пари ключів замість старих.

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

Найбільш поширеним алгоритмом генерації ключа є алгоритм RSA. Досить часто можна побачити слово RSA поруч з фразами «digital certificates» (цифрові сертифікати) або «certificate authorities» (Зустрічається два перекладу цього терміна «сертифікат автентичності» та «сертифікаційні органи». Другий переклад правильний прим. перекладача), так само використовується абревіатура «CA». Цифровий сертифікат це підписаний файл, що містить в собі відкритий ключ і деяку іншу інформацію про його власника, а так само дату закінчення терміну придатності» сертифіката. Склад інформації що міститься в сертифікаті описаний в стандарті X. 509 або PKCS #9. Ви можете почитати ці стандарти, звернувшись за адресою ftp.isi.edu/in-notes/rfc2985.txt або www.rsasecurity.com/rsalabs/pkcs, відповідно.

Цифрові сертифікати зазвичай зберігаються на так званому «Certificate Authority» сервері (сервері сертифікатів). Таким чином, від вас не потрібно обмінюватися публічними ключами вручну. Ваша криптосистема у разі необхідності сама запитує CA-сервера відкритий ключ одержувача. Така схема дозволяє будувати масштабовану систему аутентифікації. Сервер сертифікатів може зберігати сертифікати багатьох користувачів, які можуть бути як людьми, так і комп’ютерами.

Для генерації цифрових сертифікатів можна використовувати алгоритм DSA. Однак цей алгоритм запатентований і, крім того, працює трохи повільніше, ніж RSA. Про різницю між RSA і DSA можна прочитати на сторінці «часто задаються про відмінності між DSA і RSA» (див. www.rsasecurity.com/rsalabs/faq/3-4-1.html). (Взагалі сторінка RSA Laboratories’ FAQ» може стати непоганим джерелом відомостей у разі, якщо ви вирішили поглибити свої знання в області криптографії.)

Є ще одне питання яке нам слід обговорити у зв’язку з цифровими сертифікатами і CA. Цифровий сертифікат має «термін придатності» і не може бути вилучений з CA-сервера до зазначеної дати. Що станеться, якщо секретний ключ буде скомпрометовано до закінчення терміну дії сертифіката? Зрозуміло, вам захочеться згенерувати новий сертифікат, в якому буде міститися інша пара ключів. Однак ви не можете видалити скомпрометований сертифікат після закінчення його терміну придатності. Для того, що б бути впевненим, що сертифікат не буде використаний за необережності при перевірці достовірності одержувача, ви можете помістити його в CRL або Certificate Revocation List (список відкликаних сертифікатів). При кожному запиті сертифіката проводиться перевірка списку відкликаних сертифікатів для посвідчення, що сертифікат все ще дійсний.

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

Важливо усвідомити, що алгоритм Діффі-Хеллмана не використовується для генерації власне сесійного ключа, а ось інформація, одержувана з його допомогою як раз використовується в процесі генерації. Все це грунтується на досить складних математичних викладках, не рекомендованих для читання слабкими нервами (насправді, якщо не вдаватися в подробиці і не обтяжувати себе доказами з теорії поля, все досить просто прим. перекладача). Найкраще пояснення людською мовою з картинками, яке мені вдалося знайти, це стаття Кейта Палмгрена «Діффі-Хеллмановский обмін ключами нематематическое пояснення» (див. networking.earthweb.com/netsecur/article/0,,12340_624441,00.html).

Необхідно зберігати ключову інформацію настільки захищеної наскільки це можливо, тому що чим більше біт в ключі, тим краще. Можливі розміри ключа в Діффі-Хеллмановском алгоритмі діляться на групи. В таблиці зведені можливі значення Діффі-Хеллмановских груп: Найменування Розмір
1 768
2 1024
5 1536

При конфігуруванні криптосистеми використовуйте максимально підтримуваний нею розмір групи.

PFS або Perfect Forward Secrecy часто згадується в зв’язку з алгоритму Діффі-Хеллмана. PFS призначена для забезпечення гарантії того, що нова ключова інформація не буде ніяк пов’язана зі старою. Це означає, що якщо хто-небудь дізнається старий сесійний ключ, він не зможе скористатися ним для генерації нового секретного ключа. PFS корисна річ, якщо використовувана вами криптосистема підтримує цю функцію, її слід включити.

Резюме
Давайте швиденько підіб’ємо підсумок, як криптосистеми захищають дані передаються по мережі.

На початку, використовуючи відкритий ключ одержувача, ви переконуєтеся, що дані прийдуть в потрібні руки. Відкриті ключі генеруються алгоритмом RSA і зазвичай містяться в сертифікатах на сертифікаційних серверах.
Після перевірки справжності одержувача, за допомогою алгоритму Діффі-Хеллмана генерується інформація, використовувана для створення сесійного ключа.
Як тільки створена ключова інформація, створюється сесійний ключ, унікальний для кожної сесії. Цей ключ застосовується для шифрування/дешифрування даних як відправником, так і одержувачем. Саме тому важливо часто його міняти.
Перед шифруванням даних підраховується їх криптографічна контрольна сума. Після розшифровки контрольна сума перераховується для того, що б переконатися в тому, що повідомлення не було спотворено при передачі.
У наступній статті вам випаде чудова можливість подивитися у дії на багато з описаного, оскільки ми розглянемо конфігурування однією з вбудованих в FreeBSD криптосистем, а саме SSH.
Писав не я я знайшов струму