Как искать по хешу

Обновлено: 04.07.2024

Одним из ключевых слов, которые новички слышат, когда узнают о блокчейне, являются понятия хэша и алгоритма хэширования, которые кажутся распространёнными для безопасности. Запуск децентрализованной сети и консенсуса, такой как биткойн или сеть эфириум с десятками тысяч узлов, соединенных через p2p, требует, как “надежности”, так и эффективности проверки. То есть, эти системы нуждаются в способах кодирования информации в компактном формате, позволяющем обеспечить безопасную и быструю проверку ее участниками

Даже изменение одного символа во входных данных приведет к совершенно другому хэшу.

Криптографические хэши используются везде, от хранения паролей до систем проверки файлов. Основная идея состоит в том, чтобы использовать детерминированный алгоритм (алгоритмический процесс, который выдает уникальный и предопределенный результат для задачи входных данных), который принимает один вход и создает строку фиксированной длины каждый раз. То есть, использование одного и того же ввода всегда приводит к одному и тому же результату. Детерминизм важен не только для хэшей, но и для одного бита, который изменяется во входных данных, создавая совершенно другой хэш. Проблема с алгоритмами хэширования - неизбежность коллизий. То есть, тот факт, что хэши являются строкой фиксированной длины, означает, что для каждого ввода, который мы можем себе представить, есть другие возможные входы, которые приведут к тому же хэшу. Коллизия - это плохо. Это означает, что, если злоумышленник может создавать коллизии, он может передавать вредоносные файлы или данные, как имеющие правильный и неправильный хэш и скрываться под правильным хешем. Цель хорошей хэш-функции состоит в том, чтобы сделать чрезвычайно сложным для злоумышленников найти способы генерации входных данных, которые хешируются с одинаковым значением. Вычисление хэша не должно быть слишком простым, так как это облегчает злоумышленникам искусственное вычисление коллизий. Алгоритмы хэширования должны быть устойчивы к «атакам нахождения прообраза». То есть, получая хеш, было бы чрезвычайно сложно вычислить обратные детерминированные шаги, предпринятые для воспроизведения значения, которое создало хэш (т.е нахождение прообраза).

Учитывая S = hash (x), найти X должно быть почти невозможно.

Напомним, что «хорошие» алгоритмы хэширования имеют следующие свойства:

  • Изменение одного бита во входных данных должно создать эффект изменения всего хеша;
  • Вычисления хеша не должно быть слишком простым, высокая сложность нахождения прообраза;
  • Должен иметь очень низкую вероятность коллизии;

Вы когда-нибудь слышали о том, что если вы поместите 23 человека в комнату, есть 50% шанс, что у двух из них будет один и тот же день рождения? Доведение числа до 70 человек в комнате дает вам 99,9% шанс. Если голуби рассажены в коробки, причем число голубей больше числа коробок, то хотя бы в одной из клеток находится более одного голубя. То есть фиксированные ограничения на выход означают, что существует фиксированная степень перестановок, на которых можно найти коллизию.

По крайне мере, один отсек будет иметь внутри 2-ух голубей.

На самом деле MD5 настолько слаб к сопротивлению к коллизиям, что простой бытовой Процессор Pentium 2,4 ГГц может вычислить искусственные хэш-коллизии в течение нескольких секунд. Кроме того, его широкое использование в более ранние дни текущей сети создало тонны утечек MD5 предварительных прообразов в интернете, которые можно найти с помощью простого поиска Google их хэша.

Различия и развитие алгоритмов хеширования Начало: SHA1 и SHA2

NSA (Агентство национальной безопасности) уже давно является пионером стандартов алгоритмов хэширования, с их первоначальным предложением алгоритма Secure Hashing Algorithm или SHA1, создающий 160-битные выходы фиксированной длины. К сожалению, SHA1 просто улучшил MD5, увеличив длину вывода, количество однонаправленных операций и сложность этих односторонних операций, но не дает каких-либо фундаментальных улучшений против более мощных машин, пытающихся использовать различные атаки. Так как мы можем сделать что-то лучше?

В 2006 году Национальный институт стандартов и технологий (NIST) запустил конкурс, чтобы найти альтернативу SHA2, которая будет принципиально отличаться в своей архитектуре, чтобы стать стандартом. Таким образом, SHA3 появился как часть большой схемы алгоритмов хэширования, известной как KECCAK (произносится Кетч-Ак). Несмотря на название, SHA3 сильно отличается своим внутренним механизмом, известным как «конструкция губки», которая использует случайные перестановки для «Впитывания» и «Выжимания» данных, работая в качестве источника случайности для будущих входов, которые входят в алгоритм хэширования.

Когда дело дошло до интеграции алгоритма хеширования в блокчейн протоколы, биткоин использовал SHA256, в то время как Ethereum использовал модифицированный SHA3 (KECCAK256) для своего PoW. Однако важным качеством выбора хэш-функции для блокчейна с использованием доказательства работы является эффективность вычислений указанного хэша. Алгоритм хеширования биткойна SHA256 может быть вычислен достаточно просто с помощью специализированного оборудования, известного как специализированные интегральные схемы (или ASIC). Много было написано об использовании ASIC в майнинг пуле и о том, как они делают протокол направленным на централизацию вычислений. То есть доказательство работы стимулирует группы вычислительно эффективных машин объединяться в пулы и увеличивать то, что мы обозначаем “хэш-мощностью”, или мерой количества хэшей, которые машина может вычислить за интервал времени. Ethereum, выбрал модифицированный SHA3 известный как KECCAK 256. Кроме того, алгоритм PoW в Ethereum - Dagger-Hashimoto, должен был быть трудно вычисляемым для аппаратного обеспечения.

Почему биткоин использует двойное шифрование SHA256?

SHA3 не был единственным прорывом, который вышел из конкурса хеширования NIST в 2006 году. Несмотря на то, что SHA3 выиграл, алгоритм, известный как BLAKE, занял второе место. Для реализации шардинга Ethereum 2.0 использует более эффективное. Алгоритм хэширования BLAKE2b, который является высокоразвитой версией BLAKE от конкурентов, интенсивно изучается за его фантастическую эффективность по сравнению с KECCAK256 при сохранении высокой степени безопасности. Вычисление BLAKE2b фактически в 3 раза быстрее, чем KECCAK на современном процессоре.

Кажется, что независимо от того, что мы делаем, мы просто либо (1) увеличиваем сложность внутренних хеш-операций, либо (2) увеличиваем длину хеш-выхода, надеясь, что компьютеры атакующих не будут достаточно быстрыми, чтобы эффективно вычислять ее коллизию. Мы полагаемся на двусмысленность предварительных прообразов односторонних операций для обеспечения безопасности наших сетей. То есть цель безопасности алгоритма хеширования состоит в том, чтобы сделать как можно более сложным для любого, кто пытается найти два значения, которые хешируются на один и тот же вывод, несмотря на то, что существует бесконечное количество возможных столкновений. «Как насчет будущего квантовых компьютеров? Будут ли алгоритмы хэширования безопасными?» Короткий ответ и текущее понимание заключаются в том, что да, алгоритмы хэширования выдержат испытание временем против квантовых вычислений. То, что квантовые вычисления смогут сломать, - это те проблемы, которые имеют строгую математическую структуру, основанную на аккуратных трюках и теории, такой как шифрование RSA. С другой стороны, алгоритмы хэширования имеют менее формальную структуру во внутренних конструкциях. Квантовые компьютеры действительно дают повышенную скорость в вычислении неструктурированных проблем, таких как хэширование, но в конце концов, они все равно будут грубо атаковать так же, как компьютер сегодня попытается это сделать. Независимо от того, какие алгоритмы мы выбираем для наших протоколов, ясно, что мы движемся к вычислительно-эффективному будущему, и мы должны использовать наше лучшее суждение, чтобы выбрать правильные инструменты для работы и те, которые, мы надеемся, выдержат испытание временем.

Дмитриев Марк - Технический аналитик и управляющий криптоактивами инвестиционного фонда GT Blockchain Investments


В мире сущес­тву­ет нес­коль­ко зет­табайт циф­ровых дан­ных, но далеко не вся эта информа­ция уни­каль­на: пов­торы раз­бро­саны по мил­лиар­дам носите­лей и сер­веров. Незави­симо от типа дан­ных, для работы с ними тре­бует­ся решать одни и те же прин­ципи­аль­ные задачи. Это сни­жение избы­точ­ности за счет час­тично­го устра­нения пов­торов (дедуп­ликация), про­вер­ка целос­тнос­ти, инкре­мен­тное соз­дание резер­вных копий и авто­риза­ция поль­зовате­лей. Конеч­но, пос­ледний аспект инте­ресу­ет нас боль­ше все­го, одна­ко все эти тех­ничес­кие при­емы базиру­ются на общих методах обра­бот­ки дан­ных с исполь­зовани­ем хеширо­вания. Сущес­тву­ют облачные сер­висы, которые поз­воля­ют исполь­зовать эту про­цеду­ру быс­трее — с хорошо извес­тны­ми целями.

На пер­вый взгляд кажет­ся стран­ным, что в раз­ных задачах при­меня­ется общая про­цеду­ра вычис­ления и срав­нения кон­троль­ных сумм или хешей — битовых пос­ледова­тель­нос­тей фик­сирован­ной дли­ны. Одна­ко этот метод дей­стви­тель­но уни­вер­сален. Кон­троль­ные сум­мы слу­жат сво­еоб­разны­ми циф­ровыми отпе­чат­ками фай­лов, клю­чей, паролей и дру­гих дан­ных, называ­емых в крип­тогра­фии messages — сооб­щения. Хеши (или дай­джес­ты, от англ. digest) поз­воля­ют срав­нивать их меж­ду собой, быс­тро обна­ружи­вать любые изме­нения и обе­зопа­сить про­вер­ку дос­тупа. Нап­ример, с помощью хешей мож­но про­верять соот­ветс­твие вве­ден­ных паролей, не переда­вая их в откры­том виде.

Ма­тема­тичес­ки этот про­цесс выпол­няет­ся одним из алго­рит­мов хеширо­вания — ите­раци­онно­го пре­обра­зова­ния бло­ков дан­ных, на которое раз­бива­ется исходное сооб­щение. На вхо­де может быть что угод­но — от корот­кого пароля до огромной базы дан­ных. Все бло­ки цик­лично дописы­вают­ся нулями или уре­зают­ся до задан­ной дли­ны до тех пор, пока не будет получен дай­джест фик­сирован­ного раз­мера.

Пре­дель­ный объ­ем исходных дан­ных, который может обра­ботать хеш‑фун­кция, опре­деля­ется фор­мой их пред­став­ления в алго­рит­ме. Обыч­но они записы­вают­ся как целое 64-бит­ное чис­ло, поэто­му типич­ный лимит сос­тавля­ет 2 64 бит минус еди­ница, или два экса­бай­та. Такое огра­ниче­ние пока не име­ет прак­тичес­кой зна­чимос­ти даже для очень круп­ных дата‑цен­тров.

Обыч­но хеши записы­вают­ся в шес­тнад­цатерич­ном виде. Так их гораз­до удоб­нее срав­нивать на вид, а запись получа­ется в четыре раза короче дво­ичной. Самые корот­кие хеши получа­ются при исполь­зовании Adler-32, CRC32 и дру­гих алго­рит­мов с дли­ной дай­джес­та 32 бита. Самые длин­ные — у SHA-512. Кро­ме них, сущес­тву­ет с десяток дру­гих популяр­ных хеш‑фун­кций, и боль­шинс­тво из них спо­соб­но рас­счи­тывать дай­джес­ты про­межу­точ­ной дли­ны: 160, 224, 256 и 384 бит. Попыт­ки соз­дать фун­кцию с уве­личен­ной дли­ной хеша про­дол­жают­ся, пос­коль­ку чем длин­нее дай­джест, тем боль­ше раз­ных вари­антов может сге­нери­ровать хеш‑фун­кция.

Неповторимость — залог надежности

Уни­каль­ность хеша — одно из его клю­чевых свой­ств, опре­деля­ющее крип­тостой­кость сис­темы шиф­рования. Дело в том, что чис­ло вари­антов воз­можных паролей теоре­тичес­ки бес­конеч­но, а вот чис­ло хешей всег­да конеч­ное, хоть и очень боль­шое. Дай­джес­ты любой хеш‑фун­кции будут уни­каль­ны лишь до опре­делен­ной сте­пени. Сте­пени двой­ки, если быть точ­ным. К при­меру, алго­ритм CRC32 дает мно­жес­тво все­го из 2 32 вари­антов, и в нем труд­но избе­жать пов­торений. Боль­шинс­тво дру­гих фун­кций исполь­зует дай­джес­ты дли­ной 128 или 160 бит, что рез­ко уве­личи­вает чис­ло уни­каль­ных хешей — до 2 128 и 2 160 соот­ветс­твен­но.

Стро­го говоря, к хеш‑фун­кци­ям в крип­тогра­фии предъ­явля­ются более высокие тре­бова­ния, чем к кон­троль­ным сум­мам на осно­ве цик­личес­кого кода. Одна­ко эти понятия на прак­тике час­то исполь­зуют как синони­мы.

Сов­падение хешей от раз­ных исходных дан­ных (в том чис­ле паролей) называ­ют кол­лизи­ей. Она может быть слу­чай­ной (встре­чает­ся на боль­ших объ­емах дан­ных) или псев­дослу­чай­ной — исполь­зуемой в целях ата­ки. На эффекте кол­лизии осно­ван взлом раз­ных крип­тогра­фичес­ких сис­тем — в час­тнос­ти, про­токо­лов авто­риза­ции. Все они сна­чала счи­тают хеш от вве­ден­ного пароля или клю­ча, а затем переда­ют этот дай­джест для срав­нения, час­то при­меши­вая к нему на каком‑то эта­пе пор­цию псев­дослу­чай­ных дан­ных, или исполь­зуют допол­нитель­ные алго­рит­мы шиф­рования для уси­ления защиты. Сами пароли ниг­де не сох­раня­ются: переда­ются и срав­нива­ются толь­ко их дай­джес­ты. Здесь важ­но то, что пос­ле хеширо­вания абсо­лют­но любых паролей одной и той же фун­кци­ей на выходе всег­да получит­ся дай­джест оди­нако­вого и заранее извес­тно­го раз­мера.

Псевдореверс

Про­вес­ти обратное пре­обра­зова­ние и получить пароль непос­редс­твен­но из хеша невоз­можно в прин­ципе, даже если очис­тить его от соли, пос­коль­ку хеширо­вание — это одно­нап­равлен­ная фун­кция. Гля­дя на получен­ный дай­джест, нель­зя понять ни объ­ем исходных дан­ных, ни их тип. Одна­ко мож­но решить сход­ную задачу: сге­нери­ровать пароль с таким же хешем. Из‑за эффекта кол­лизии задача упро­щает­ся: воз­можно, ты никог­да не узна­ешь нас­тоящий пароль, но най­дешь совер­шенно дру­гой, дающий пос­ле хеширо­вания по это­му же алго­рит­му тре­буемый дай­джест.

Для это­го надо сде­лать все­го ничего — рас­счи­тать 2 128 пар вида пароль — хеш или на порядок‑дру­гой боль­ше — в зависи­мос­ти от дли­ны дай­джес­та выб­ранной фун­кции. Одна­ко все эти двой­ки в чер­тов­ски боль­шой сте­пени отпу­гива­ют, толь­ко если думать о скром­ных воз­можнос­тях собс­твен­ной машины. Хорошо, что ско­рость нахож­дения пароля по его хешу сегод­ня необя­затель­но зависит от вычис­литель­ной мощ­ности компь­юте­ра самого ата­кующе­го, пос­коль­ку во мно­гих слу­чаях для это­го уже не тре­бует­ся выпол­нять дол­гий перебор. Мно­гое уже сде­лано до нас.

Ме­тоды опти­миза­ции рас­четов появ­ляют­ся бук­валь­но каж­дый год. Ими занима­ются коман­ды HashClash, Distributed Rainbow Table Generator и дру­гих меж­дународ­ных про­ектов крип­тогра­фичес­ких вычис­лений. В резуль­тате на каж­дое корот­кое сочета­ние печат­ных сим­волов или вари­ант из спис­ка типич­ных паролей хеши уже вычис­лены. Их мож­но быс­тро срав­нить с перех­вачен­ным, пока не най­дет­ся пол­ное сов­падение.

Рань­ше на это тре­бова­лись недели или месяцы про­цес­сорно­го вре­мени, которые в пос­ледние годы уда­лось сок­ратить до нес­коль­ких часов бла­года­ря мно­гоядер­ным про­цес­сорам и перебо­ру в прог­раммах с под­дер­жкой CUDA и OpenCL. Адми­ны наг­ружа­ют рас­четами таб­лиц сер­веры во вре­мя прос­тоя, а кто‑то арен­дует вир­туаль­ный клас­тер в Amazon EC2.

Искать XOR вычислять

По­пуляр­ные алго­рит­мы хеширо­вания работа­ют нас­толь­ко быс­тро, что к нас­тояще­му момен­ту уда­лось сос­тавить пары «хеш — пароль» поч­ти для всех воз­можных вари­антов фун­кций с корот­ким дай­джес­том. Парал­лель­но у фун­кций с дли­ной хеша от 128 бит находят недос­татки в самом алго­рит­ме или его кон­крет­ных реали­заци­ях, что силь­но упро­щает взлом.

В девянос­тых годах край­не популяр­ным стал алго­ритм MD5, написан­ный Рональ­дом Ривес­том. Он стал широко при­менять­ся при авто­риза­ции поль­зовате­лей на сай­тах и при под­клю­чении к сер­верам кли­ент­ских при­ложе­ний. Одна­ко его даль­нейшее изу­чение показа­ло, что алго­ритм недос­таточ­но надежен. В час­тнос­ти, он уяз­вим к ата­кам по типу псев­дослу­чай­ной кол­лизии. Ины­ми сло­вами, воз­можно пред­намерен­ное соз­дание дру­гой пос­ледова­тель­нос­ти дан­ных, хеш которой будет в точ­ности соот­ветс­тво­вать извес­тно­му.

Пос­коль­ку дай­джес­ты сооб­щений широко при­меня­ются в крип­тогра­фии, на прак­тике исполь­зование алго­рит­ма MD5 сегод­ня при­водит к серь­езным проб­лемам. Нап­ример, с помощью такой ата­ки мож­но под­делать циф­ровой сер­тификат x.509. В том чис­ле воз­можна под­делка сер­тифика­та SSL, поз­воля­ющая зло­умыш­ленни­ку выдавать свой фейк за доверен­ный кор­невой сер­тификат (CA). Более того, в боль­шинс­тве наборов доверен­ных сер­тифика­тов лег­ко най­ти те, которые по‑преж­нему исполь­зуют алго­ритм MD5 для под­писи. Поэто­му сущес­тву­ет уяз­вимость всей инфраструк­туры откры­тых клю­чей (PKI) для таких атак.

Из­нуритель­ную ата­ку перебо­ром устра­ивать при­дет­ся толь­ко в слу­чае дей­стви­тель­но слож­ных паролей (сос­тоящих из боль­шого набора слу­чай­ных сим­волов) и для хеш‑фун­кций с дай­джес­тами боль­шой дли­ны (от 160 бит), у которых пока не наш­ли серь­езных недос­татков. Огромная мас­са корот­ких и сло­вар­ных паролей сегод­ня вскры­вает­ся за пару секунд с помощью онлай­новых сер­висов.

Бойцы облачного фронта

1. Про­ект «Убий­ца хешей» сущес­тву­ет уже поч­ти восемь лет. Он помога­ет вскрыть дай­джес­ты MD5, SHA-160 и NTLM. Текущее количес­тво извес­тных пар сос­тавля­ет 43,7 мил­лиона. На сайт мож­но заг­ружать сра­зу нес­коль­ко хешей для парал­лель­ного ана­лиза. Пароли, содер­жащие кирил­лицу и сим­волы дру­гих алфа­витов, кро­ме англий­ско­го, иног­да находят­ся, но отоб­ража­ются в невер­ной кодиров­ке. Еще здесь про­водит­ся пос­тоян­ный кон­курс взло­ма паролей по их хешам и дос­тупны ути­литы для облегче­ния этой задачи — нап­ример, прог­раммы для объ­еди­нения спис­ков паролей, их перефор­матиро­вания и устра­нения пов­торов.

HashKiller не дру­жит с кирил­лицей, но зна­ет кирил­личес­кие пароли «Убий­ца хешей» нашел три пароля из пяти за пол­секун­ды

2. «Крэк‑стан­ция» под­держи­вает работу с хешами прак­тичес­ки всех реаль­но исполь­зуемых типов. LM, NTLM, MySQL 4.1+, MD2/4/5 + MD5-half, SHA-160/224/256/384/512, ripeMD160 и Whirlpool. За один раз мож­но заг­рузить для ана­лиза до десяти хешей. Поиск про­водит­ся по индекси­рован­ной базе. Для MD5 ее объ­ем сос­тавля­ет 15 мил­лионов пар (око­ло 190 Гб) и еще при­мер­но по 1,5 мил­лиона для каж­дой дру­гой хеш‑фун­кции.

«Крэк-станция» находит многие словарные пароли даже по хешам NTLM

«Крэк‑стан­ция» находит мно­гие сло­вар­ные пароли даже по хешам NTLM

По уве­рени­ям соз­дателей, в базу вклю­чены все сло­ва из англо­языч­ной вер­сии Википе­дии и боль­шинс­тво популяр­ных паролей, соб­ранных из обще­дос­тупных спис­ков. Сре­ди них есть и хит­рые вари­анты со сме­ной регис­тра, лит­спи­ком, пов­тором сим­волов, зер­калиро­вани­ем и про­чими ухищ­рени­ями. Одна­ко слу­чай­ные пароли даже из пяти сим­волов ста­новят­ся проб­лемой — в моем тес­те полови­на из них не была най­дена даже по LM-хешам.

«Крэк-станция» с трудом вскрывает случайные пароли длиной от пяти символов даже по LM-хешам

«Крэк‑стан­ция» с тру­дом вскры­вает слу­чай­ные пароли дли­ной от пяти сим­волов даже по LM-хешам

«Облачный крэкер» мгновенно находит словарные пароли по их хешам

«Облачный крэ­кер» мгно­вен­но находит сло­вар­ные пароли по их хешам

Собс­твен­ного поис­ка на сай­те пока нет, но пароль или его хеш мож­но написать пря­мо в адресной стро­ке бра­узе­ра, добавив его пос­ле адре­са сай­та и пре­фик­са /encrypt/.

Сервис MD5Decode знает все типы хешей от словарных паролей

Сер­вис MD5Decode зна­ет все типы хешей от сло­вар­ных паролей

MD5Decrypt находит составные словарные пароли, но хеши на анализ принимает только по одному

MD5Decrypt находит сос­тавные сло­вар­ные пароли, но хеши на ана­лиз при­нима­ет толь­ко по одно­му

Ищем хеши Гуглом


Да­леко не все сер­висы готовы пре­дос­тавить услу­гу поис­ка паролей по хешам бес­плат­но. Где‑то тре­бует­ся регис­тра­ция и кру­тит­ся тон­на рек­ламы, а на мно­гих сай­тах мож­но встре­тить и объ­явле­ния об услу­ге плат­ного взло­ма. Часть из них дей­стви­тель­но исполь­зует мощ­ные клас­теры и заг­ружа­ет их, ста­вя прис­ланные хеши в оче­редь заданий, но есть и обыч­ные прой­дохи. Они выпол­няют бес­плат­ный поиск за день­ги, поль­зуясь неос­ведом­ленностью потен­циаль­ных кли­ентов.

Вмес­то того что­бы рек­ламиро­вать здесь чес­тные сер­висы, я пред­ложу исполь­зовать дру­гой под­ход —находить пары хеш — пароль в популяр­ных поис­ковых сис­темах. Их роботы‑пауки ежед­невно про­чесы­вают веб и собира­ют новые дан­ные, сре­ди которых есть и све­жие записи из радуж­ных таб­лиц.

По­это­му для начала прос­то напиши хеш в поис­ковой стро­ке Google. Если ему соот­ветс­тву­ет какой‑то сло­вар­ный пароль, то он (как пра­вило) отоб­разит­ся сре­ди резуль­татов поис­ковой выдачи уже на пер­вой стра­нице. Еди­нич­ные хеши мож­но погуг­лить вруч­ную, а боль­шие спис­ки будет удоб­нее обра­ботать с помощью скрип­та BozoCrack.

Универсальный подход

Сре­ди десят­ка хеш‑фун­кций наибо­лее популяр­ны MD5 и SHA-1, но точ­но такой же под­ход при­меним и к дру­гим алго­рит­мам. К при­меру, файл реес­тра SAM в ОС семей­ства Windows по умол­чанию хра­нит два дай­джес­та каж­дого пароля: LM-хеш (уста­рев­ший тип на осно­ве алго­рит­ма DES) и NT-хеш (соз­дает­ся путем пре­обра­зова­ния юни­код­ной записи пароля по алго­рит­му MD4). Дли­на обо­их хешей оди­нако­ва (128 бит), но стой­кость LM зна­читель­но ниже из‑за мно­жес­тва упро­щений алго­рит­ма.

Пос­тепен­но оба типа хешей вытес­няют­ся более надеж­ными вари­анта­ми авто­риза­ции, но мно­гие эту ста­рую схе­му исполь­зуют в исходном виде до сих пор. Ско­пиро­вав файл SAM и рас­шифро­вав его сис­темным клю­чом из фай­ла SYSTEM, ата­кующий получа­ет спи­сок локаль­ных учет­ных записей и сох­ранен­ных для них кон­троль­ных зна­чений — хешей.

Да­лее взлом­щик может най­ти пос­ледова­тель­ность сим­волов, которая соот­ветс­тву­ет хешу адми­нис­тра­тора. Так он получит пол­ный дос­туп к ОС и оста­вит в ней мень­ше сле­дов, чем при гру­бом взло­ме с помощью баналь­ного сбро­са пароля. Напоми­наю, что из‑за эффекта кол­лизии под­ходящий пароль не обя­затель­но будет таким же, как у реаль­ного вла­дель­ца компь­юте­ра, но для Windows раз­ницы меж­ду ними не будет вов­се. Как пела груп­па Bad Religion, «Cause to you I’m just a number and a clever screen name».

Ана­логич­ная проб­лема сущес­тву­ет и в дру­гих сис­темах авто­риза­ции. Нап­ример, в про­токо­лах WPA/WPA2, широко исполь­зуемых при соз­дании защищен­ного под­клю­чения по Wi-Fi. При соеди­нении меж­ду бес­про­вод­ным устрой­ством и точ­кой дос­тупа про­исхо­дит стан­дар­тный обмен началь­ными дан­ными, вклю­чающи­ми в себя handshake. Во вре­мя «рукопо­жатия» пароль в откры­том виде не переда­ется, но в эфир отправ­ляет­ся ключ, осно­ван­ный на хеш‑фун­кции. Нуж­ные пакеты мож­но перех­ватить, перек­лючив с помощью модифи­циро­ван­ного драй­вера при­емник адап­тера Wi-Fi в режим монито­рин­га. Более того, в ряде слу­чаев мож­но не ждать момен­та сле­дующе­го под­клю­чения, а ини­циали­зиро­вать эту про­цеду­ру при­нуди­тель­но, отпра­вив широко­веща­тель­ный зап­рос deauth всем под­клю­чен­ным кли­ентам. Уже в сле­дующую секун­ду они попыта­ются вос­ста­новить связь и нач­нут серию «рукопо­жатий».

Сох­ранив файл или фай­лы с хен­дшей­ком, мож­но выделить из них хеш пароля и либо узнать сам пароль, либо най­ти какой‑то дру­гой, который точ­ка дос­тупа при­мет точ­но так же. Мно­гие онлай­новые сер­висы пред­лага­ют про­вес­ти ана­лиз не толь­ко чис­того хеша, но и фай­ла с записан­ным хен­дшей­ком. Обыч­но тре­бует­ся ука­зать файл pcap и SSID выб­ранной точ­ки дос­тупа, так как ее иден­тифика­тор исполь­зует­ся при фор­мирова­нии клю­ча PSK.

По­ка с помощью онлай­новых сер­висов и радуж­ных таб­лиц находят­ся далеко не все пары хеш — пароль. Одна­ко фун­кции с корот­ким дай­джес­том уже побеж­дены, а корот­кие и сло­вар­ные пароли лег­ко обна­ружить даже по хешам SHA-160. Осо­бен­но впе­чат­ляет мгно­вен­ный поиск паролей по их дай­джес­там с помощью Гуг­ла. Это самый прос­той, быс­трый и совер­шенно бес­плат­ный вари­ант.

Этичный хакинг и тестирование на проникновение, информационная безопасность

В статье «Хеши: определение типа, подсчёт контрольных сумм, нестандартные и итерированные хеши» мы уже знакомились с такими утилитами как hashID и HashTag, которые по строке хеша определяют, по какому алгоритму он был вычислен.

Упомянутые инструменты по-прежнему работают, но мир не стоит на месте (а развитие этих программ — стоит). Сейчас появились новые типы хешей, поддержка которых не реализована или имеет ошибки в данных инструментах.

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

Зачем нужны новые инструменты идентификации типа хеша?

hashID не поддерживается с марта 2015 года, hash-identifier не поддерживается с 2011 года, Dagon с июня 2018 года и findmyhash с 2011 года. Все они не имеют вовсе, или имеют неправильную, ошибочную поддержку современных хешей, таких как Keccak/SHA3/Blake2 и т. д. Также такой инструмент, как hash-identifier, который является полностью интерактивным, не имеет параметров и не удобен для использования в скриптах. findmyhash имеет очень ограниченный набор обнаруживаемых хешей. Самый интересный инструмент — hashID (для идентификации хеша), но, поскольку он не поддерживается более 5 лет, проблемы и открытые PR (Pull Request — запросы на внесение изменения в исходный код) накапливаются, ошибки не исправляются, а некоторые функции отсутствуют.

Это всё могло побудить авторов создать новые инструменты с возможностями отсутствующими в предшественниках.

Посмотрим на сравнительную таблицу инструментов по определению типа хеша:

Образцы хешей

Если вам нужны образцы хешей для поверки инструментов, то смотрите раздел «Где посмотреть примеры хешей».

Я отобрал несколько хешей для анализа:

Хеши необходимо заключать в одинарные кавычки!

Хеши могу включать в себя специальные символы, которые имеют для оболочки специальное значение. Особенно это важно если вы работаете в Linux. Если вы не будете это учитывать, то программа по определению типа хеша хоть и не сообщит об ошибке, но получит строку отличную от той, которую вы думали что ввели.

Причём даже в двойных кавычках оболочка трактует некоторые символы как специальные. Поэтому чтобы не экранировать их, поместите весь хеш в одинарные кавычки.

Необязательно помещать в кавычки хеши, состоящие только из букв и цифр, но я предпочитаю все хеши передавать в одинарных кавычках.

HAITI

HAITI (HAsh IdenTifIer) — это инструмент командной строки (и библиотека) для идентификации типа заданного хеша. Библиотека особенно хороша для написания скриптов, поскольку не нужно заключать инструмент командной строки в подпроцесс.

  • Определение типов 382+ хешей
  • Поддержка современных алгоритмов (SHA3, Keccak, Blake2 и прочее)
  • Краткая информация по использованию хеша с Hashcat и John the Ripper
  • Инструмент командной строки и библиотека
  • Цветной вывод

Использование программы очень простое — укажите ваш хеш после имени программы:

Причём ОПЦИИ являются необязательными, поведение программы по умолчанию очень сбалансированной и в большинстве случаев вам не захочется менять его какими-либо дополнительными параметрами.


Среди вывода есть и правильный ответ: SHA3-512

В выводе HC — это сокращение для Hashcat, а последующие цифры (например, 1700, 17600 и так далее) это номера режимов в данной программе.

JtR — это сокращение от John the Ripper, а последующие строки — это название алгоритмов хешей для взлома в данной программе (raw-sha512, raw-sha3 и так далее).

Цвет очень хорошо улучшает читаемость вывода, особенно если он обширный. Если вы хотите отключить цветной вывод, то используйте опцию --no-color:


Хотя зачастую вывод содержит более одного предположения о типе хеша, по умолчанию из него исключены алгоритмы с солью. Чтобы показать все возможные алгоритмы хеширования, в том числе с использованием соли используйте опцию -e или --extended:


Если вы хотите только узнать тип хеша и информация о режимах hashcat и john the ripper для вас является излишней, то вы можете указать опцию --short для укороченного вывода:


Name-That-Hash

С января 2021 года, почти через два года после того, как началась работа над HAITI, появился проект под названием Name-That-Hash, потому что автору требовалась библиотека Python для Ciphey. Теперь есть два актуальных варианта для идентификации хеша.

Name That Hash определяет тип хеша. Программа поддерживает MD5, SHA256 и более 300 других хешей.

Особенности Name That Hash:

  • Рейтинги популярности — Сначала вы увидите самые популярные хеши.
  • Сводки хешей — Name-that-hash выведет краткую информацию об основах использования каждого хеша, позволяя вам сделать осознанный выбор.
  • Цветной вывод — контрастный и наглядный.
  • Вывод в JSON и в API — вы можете использовать Name-That-Hash в своём проекте, поскольку программа имеет API и интерфейс командной строки. Используйте вывод JSON или импортируйте программу как модуль Python!
  • Актуальна — Name-That-Hash — это проект 2021 года.
  • Продуманность — авторы продумали функции, интерфейс и опции с мыслью об удобстве использования.
  • Расширяемость — добавляйте новые хеши так быстро, как только сможете редактировать текстовый файл.
  • Работа с файлами — программа считывает построчно файл и проверяет тип каждого хеша.
  • Поиск хешей — экстремальный режим, который пытается выделить хеш даже если строка содержит мусор.

Для определения типа хеша укажите его с опцией -t (--text):


Хеши разбиты на две группы:

  • Most Likely — более вероятные варианты
  • Least Likely — менее вероятные варианты

Причём в этих группах они также отсортированы по частоте использования.

В выводе вы можете увидеть уже знакомые строки HC и JtR с номерами и названиями алгоритмов хеширования в Hashcat и John.

Кроме этого, имеется краткое описание применения, например:

  • Summary: Used in Bitcoin Blockchain and Shadow Files.
  • Summary: Used in Wireguard, Zcash, IPFS and more.
  • Summary: Not considered a hash function

Причём обратите внимание, некоторые записи являются гиперсылками (они подчёркнуты точками) и для получения дополнительной информации можно пройти на веб-страницу. Всё это делается для того, чтобы вы могли сориентироваться в предлагаемых типах хешей и выбрать наиболее подходящий.

Для проверки множества хешей используйте опцию -f (--file):

Формат файла — один хеш на строку.

Одна из этих опций (-t или -f) являются обязательной.

Если ваши хеши кодированы в Base64, то используйте опцию -b64 (--base64). Она говорит программе перед идентификацией декодировать хеши из Base64. Для файлов со смешанными строками Base64 и в обычном тексте программа пытается вначале декодировать base64 и если это не получается, то трактует хеш как обычную строку без кодировки.

Обратите внимание, что в качестве хеша (после шапки) показана уже декодированная строка.


По идее, следующие две команды должны дать одинаковый результат:

Но у меня они получились разные. Поэтому используйте этот режим скорее как экспериментальный.

Бесплатное онлайн определение типа хеша

Сервис Онлайн определение типа хеша существует уже давно. Он работает очень просто — вы вводите хеш и получаете тип хеша. Ранее он основывался на утилитах hashID и HashTag. Теперь сервис обновлён и работает с утилитами HAITI и Name That Hash — самыми актуальными инструментами для определения типа хеша.

Заключение

Как можно убедиться, трудно выбрать, какая из программ лучше — HAITI или Name That Hash. Можно пользоваться или двумя. Либо если вам нужен вывод в формате JSON или вам нужна поддержка API или библиотека для определения хешей, то вы можете выбрать наиболее подходящую для ваших потребностей.

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


Криптографические хеш-функции — незаменимый и повсеместно распространенный инструмент, используемый для выполнения целого ряда задач, включая аутентификацию, проверку целостности данных, защиту файлов и даже обнаружение зловредного ПО. Существует масса алгоритмов хеширования, отличающихся криптостойкостью, сложностью, разрядностью и другими свойствами. Считается, что идея хеширования принадлежит сотруднику IBM, появилась около 50 лет назад и с тех пор не претерпела принципиальных изменений. Зато в наши дни хеширование обрело массу новых свойств и используется в очень многих областях информационных технологий.

Что такое хеш?

Если коротко, то криптографическая хеш-функция, чаще называемая просто хешем, — это математический алгоритм, преобразовывающий произвольный массив данных в состоящую из букв и цифр строку фиксированной длины. Причем при условии использования того же типа хеша длина эта будет оставаться неизменной, вне зависимости от объема вводных данных. Криптостойкой хеш-функция может быть только в том случае, если выполняются главные требования: стойкость к восстановлению хешируемых данных и стойкость к коллизиям, то есть образованию из двух разных массивов данных двух одинаковых значений хеша. Интересно, что под данные требования формально не подпадает ни один из существующих алгоритмов, поскольку нахождение обратного хешу значения — вопрос лишь вычислительных мощностей. По факту же в случае с некоторыми особо продвинутыми алгоритмами этот процесс может занимать чудовищно много времени.

Как работает хеш?

Например, мое имя — Brian — после преобразования хеш-функцией SHA-1 (одной из самых распространенных наряду с MD5 и SHA-2) при помощи онлайн-генератора будет выглядеть так: 75c450c3f963befb912ee79f0b63e563652780f0. Как вам скажет, наверное, любой другой Брайан, данное имя нередко пишут с ошибкой, что в итоге превращает его в слово brain (мозг). Это настолько частая опечатка, что однажды я даже получил настоящие водительские права, на которых вместо моего имени красовалось Brain Donohue. Впрочем, это уже другая история. Так вот, если снова воспользоваться алгоритмом SHA-1, то слово Brain трансформируется в строку 97fb724268c2de1e6432d3816239463a6aaf8450. Как видите, результаты значительно отличаются друг от друга, даже несмотря на то, что разница между моим именем и названием органа центральной нервной системы заключается лишь в последовательности написания двух гласных. Более того, если я преобразую тем же алгоритмом собственное имя, но написанное уже со строчной буквы, то результат все равно не будет иметь ничего общего с двумя предыдущими: 760e7dab2836853c63805033e514668301fa9c47.

Впрочем, кое-что общее у них все же есть: каждая строка имеет длину ровно 40 символов. Казалось бы, ничего удивительного, ведь все введенные мною слова также имели одинаковую длину — 5 букв. Однако если вы захешируете весь предыдущий абзац целиком, то все равно получите последовательность, состоящую ровно из 40 символов: c5e7346089419bb4ab47aaa61ef3755d122826e2. То есть 1128 символов, включая пробелы, были ужаты до строки той же длины, что и пятибуквенное слово. То же самое произойдет даже с полным собранием сочинений Уильяма Шекспира: на выходе вы получите строку из 40 букв и цифр. При всем этом не может существовать двух разных массивов данных, которые преобразовывались бы в одинаковый хеш.

Вот как это выглядит, если изобразить все вышесказанное в виде схемы:

Как работает хеширование

Для чего используется хеш?

Отличный вопрос. Однако ответ не так прост, поскольку криптохеши используются для огромного количества вещей.

Для нас с вами, простых пользователей, наиболее распространенная область применения хеширования — хранение паролей. К примеру, если вы забыли пароль к какому-либо онлайн-сервису, скорее всего, придется воспользоваться функцией восстановления пароля. В этом случае вы, впрочем, не получите свой старый пароль, поскольку онлайн-сервис на самом деле не хранит пользовательские пароли в виде обычного текста. Вместо этого он хранит их в виде хеш-значений. То есть даже сам сервис не может знать, как в действительности выглядит ваш пароль. Исключение составляют только те случаи, когда пароль очень прост и его хеш-значение широко известно в кругах взломщиков. Таким образом, если вы, воспользовавшись функцией восстановления, вдруг получили старый пароль в открытом виде, то можете быть уверены: используемый вами сервис не хеширует пользовательские пароли, что очень плохо.

Еще один пример, покруче. Не так давно по тематическим сайтам прокатилась новость о том, что популярный облачный сервис Dropbox заблокировал одного из своих пользователей за распространение контента, защищенного авторскими правами. Герой истории тут же написал об этом в твиттере, запустив волну негодования среди пользователей сервиса, ринувшихся обвинять Dropbox в том, что он якобы позволяет себе просматривать содержимое клиентских аккаунтов, хотя не имеет права этого делать.

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

Как при помощи хеша ловить вирусы?

Криптографические хеш-функции также могут использоваться для защиты от фальсификации передаваемой информации. Иными словами, вы можете удостовериться в том, что файл по пути куда-либо не претерпел никаких изменений, сравнив его хеши, снятые непосредственно до отправки и сразу после получения. Если данные были изменены даже всего на 1 байт, хеш-коды будут отличаться, как мы уже убедились в самом начале статьи. Недостаток такого подхода лишь в том, что криптографическое хеширование требует больше вычислительных мощностей или времени на вычисление, чем алгоритмы с отсутствием криптостойкости. Зато они в разы надежнее.

Кстати, в повседневной жизни мы, сами того не подозревая, иногда пользуемся простейшими хешами. Например, представьте, что вы совершаете переезд и упаковали все вещи по коробкам и ящикам. Погрузив их в грузовик, вы фиксируете количество багажных мест (то есть, по сути, количество коробок) и запоминаете это значение. По окончании выгрузки на новом месте, вместо того чтобы проверять наличие каждой коробки по списку, достаточно будет просто пересчитать их и сравнить получившееся значение с тем, что вы запомнили раньше. Если значения совпали, значит, ни одна коробка не потерялась.

Читайте также: