Се­год­ня мы с тобой раз­работа­ем собс­твен­ную прог­рамму для шиф­рования фай­лов. Писать будем на C++ и исполь­зуем крип­тоал­горит­мы из биб­лиоте­ки Botan. Давай пос­мотрим, какие под­водные кам­ни есть при раз­работ­ке подоб­ных прог­рамм и как ненаро­ком не помочь ата­кующе­му.
 

Что помогает атакующему взломать шифрование

Зна­читель­но облегчить задачу ата­кующе­му, который пыта­ется взло­мать зашиф­рован­ный файл, может ряд фак­торов:

  • Дли­на и слож­ность пароля. Нап­ример, перебор 4-сим­воль­ного пароля зай­мет гораз­до мень­ше вре­мени, чем 12-сим­воль­ного, а если рас­ширить алфа­вит, нап­ример исполь­зовав бук­вы вер­хне­го и ниж­него регис­тра, циф­ры и спец­симво­лы, то это зна­читель­но уве­личи­вает прос­транс­тво вари­антов для перебо­ра, что силь­но замед­лит взлом. Разуме­ется, пароли не дол­жны быть любым сло­вар­ным сло­вом или про­изводным от него, ина­че такой пароль будет взло­ман ата­кой по сло­варю. Так­же сущес­тву­ют так называ­емые rainbow tables («радуж­ные таб­лицы») — пред­вычис­ленные таб­лицы хешей паролей. Они поз­воля­ют находить исходный пароль по его хешу. Если для шиф­рования или хеширо­вания пароля не исполь­зовались соль или дру­гие защит­ные меры, такие ата­ки могут быть дос­таточ­но эффектив­ными.
  • Ошиб­ки в реали­зации крип­тогра­фии. Как уже мно­го раз говори­лось, не сто­ит изоб­ретать свои алго­рит­мы шиф­рования и луч­ше при­дер­живать­ся готовых и популяр­ных биб­лиотек с откры­тым исходным кодом. Выбирай про­верен­ные вре­менем и крип­тоана­лити­ками алго­рит­мы шиф­рования, хеширо­вания и KDF.
  • Ме­тадан­ные. Прог­раммы шиф­рования фай­лов могут оставлять кучу метадан­ных: нап­ример, соз­давать в зашиф­рован­ном фай­ле заголо­вок, в котором ука­зыва­ются алго­рит­мы шиф­рования и хеширо­вания, вер­сия прог­раммы и еще куча дан­ных. Прак­тичес­ки все эти дан­ные могут помочь ата­кующе­му во взло­ме. Если уже заранее извес­тны все исполь­зуемые алго­рит­мы, то нуж­но прос­то тар­гетиро­ван­но ата­ковать их. Даже прос­тая сме­на рас­ширения фай­ла на уни­каль­ное для тво­ей прог­раммы иног­да может помочь.
  • Из­вес­тные пат­терны откры­того тек­ста. Если ата­кующий зна­ет часть исходно­го тек­ста, он может при­менить ата­ку с извес­тным тек­стом. К при­меру, зна­ние, что файл содер­жит опре­делен­ную стан­дар­тную информа­цию, может помочь в ата­ке (нап­ример, ког­да есть стан­дар­тный заголо­вок фай­ла).
  • Нас­трой­ки по умол­чанию. Если в прог­рамме есть какие‑то зна­чения по умол­чанию, то в боль­шинс­тве слу­чаев имен­но они и будут исполь­зовать­ся. Если это прог­рамма для шиф­рования, то поль­зовате­ли будут выбирать алго­рит­мы и их парамет­ры, задан­ные изна­чаль­но.

Как мож­но все­му это­му про­тивос­тоять? Давай пос­мотрим на воп­рос гла­зами раз­работ­чика шиф­рующей прог­раммы. Вот что его про­дукт дол­жен делать:

  • из поль­зователь­ско­го пароля вырабо­тать ключ шиф­рования;
  • за­шиф­ровать или рас­шифро­вать дан­ные;
  • учесть при этом перечис­ленные век­торы ата­ки.

Зву­чит прос­то, но есть некото­рые тон­кости, которые мы обсу­дим далее.

Случайные числа и важность PRNG

Пе­ред началом работы с шиф­ровани­ем необ­ходимо поз­накомить­ся с базовы­ми поняти­ями крип­тогра­фии, с которы­ми при­дет­ся стол­кнуть­ся и которые нуж­но будет понимать: соль (salt) и век­тор ини­циали­зации (initialization vector, IV). Это два ком­понен­та, которые исполь­зуют­ся в крип­тогра­фичес­ких про­цес­сах для повыше­ния безопас­ности. Хотя они слу­жат схо­жим целям (пре­дот­вра­щение пред­ска­зуемос­ти), их роли и спо­собы исполь­зования раз­лича­ются.

Соль при­меня­ется в про­цес­се хеширо­вания для соз­дания уни­каль­ных хешей (в том чис­ле KDF), даже если пароль или дру­гие исходные дан­ные для хеширо­вания оди­нако­вы. Это усложня­ет попыт­ки атак методом под­бора и rainbow-атак, пос­коль­ку добав­ляет слу­чай­ность к хешу. Какую дли­ну соли выб­рать? Если опус­тить некото­рые матема­тичес­кие рас­четы (которые все рав­но ник­то не чита­ет), то мож­но ска­зать, что дли­на соли в 256 бит и более счи­тает­ся сегод­ня безопас­ной.

Век­тор ини­циали­зации при­меня­ется в сим­метрич­ном шиф­ровании (нап­ример, в режиме CBC, CFB или GCM) и нужен для того, что­бы оди­нако­вые сооб­щения, зашиф­рован­ные оди­нако­вым клю­чом, давали раз­ные резуль­таты. Это пре­дот­вра­щает пред­ска­зуемость зашиф­рован­ных дан­ных, улуч­шая их безопас­ность.

Соль и IV дол­жны быть слу­чай­ными, но слу­чай­ность соли более кри­тич­на, чем слу­чай­ность IV. Стро­го говоря, IV дол­жен быть прос­то уни­каль­ным для зашиф­рован­ных дан­ных при исполь­зовании режима GCM (для режима AEAD более вер­но его наз­вать nonce). Биб­лиоте­ка Botan, которая исполь­зует­ся в статье, поз­воля­ет генери­ровать слу­чай­ные чис­ла при помощи фун­кций randomize_with_ts_input и randomize.

 

Шифруем файлы

 

Как создается ключ шифрования

Пос­ле того как поль­зователь вве­дет пароль для шиф­рования дан­ных, его необ­ходимо прев­ратить в ключ шиф­рования. Для это­го при­дума­ны спе­циаль­ные матема­тичес­кие фун­кции выработ­ки клю­ча из пароля — Key Derivation Function (KDF). Еще их называ­ют «мед­ленные хеши», потому что ключ из пароля соз­дает­ся мед­ленно: эта про­цеду­ра тре­бует зна­читель­ных ресур­сов про­цес­сора и опе­ратив­ной памяти. Так сде­лано намерен­но, что­бы про­тивос­тоять ата­кам сплош­ного перебо­ра (или по боль­шому сло­варю): ата­кующе­му нуж­но переб­рать сот­ни мил­лионов ком­бинаций, что­бы получить пра­виль­ный пароль, а ког­да исполь­зуют­ся силь­ные фун­кции KDF, ско­рость под­бора будет кри­тичес­ки мала и на взлом пароля уйдет слиш­ком мно­го вре­мени.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии