Хэш-функция: что это такое, зачем нужна и какой бывает. Что такое хеш и для чего он нужен? Что такое хэш в секунду

Жаропонижающие средства для детей назначаются педиатром. Но бывают ситуации неотложной помощи при лихорадке, когда ребенку нужно дать лекарство немедленно. Тогда родители берут на себя ответственность и применяют жаропонижающие препараты. Что разрешено давать детям грудного возраста? Чем можно сбить температуру у детей постарше? Какие лекарства самые безопасные?

Многие майнят, или майнинили, или собираются начать майнить, подбирая себе оборудование по максимуму каких-то там гигахешей. На что это за хеши такие?

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

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

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

  1. Во-первых, одним и тем же входным данным всегда соответствует одно и то же число. То есть, если вы каждый раз будете вводить один и тот же пароль, хеширование будет генерировать одно и то же число на выходе, которое ему соответствует.
  2. Во-вторых, хеширование – это однонаправленный процесс. Практически невозможно взять значение хеша и при помощи обратной разработки раскрыть, что было на входе. Таким образом невозможно пойти от обратного, и введя значение хеша, то есть то самое крупное число, определить пароль. Именно благодаря этим двум пунктам хеш и используется как самостоятельный метод обработки данных. Если бы процесс был обратим, он назывался бы не хешированием, а старым добрым шифрованием/дешифрованием, что в современном мире малоэффективно.

Теперь как это работает на еще более простом примере. Вы регистрируетесь на сайте, вводите свой пароль. Система обрабатывает его и генерирует хеш, который соответствует вашему паролю. При этом сам пароль в базе не сохраняется. И теперь, когда вы будете заходить на этот сайт и вводить этот пароль, система будет генерировать хеш, сравнивать его с хранящимся значением, и одобрять доступ при совпадении. А хакеры, взломав систему, получат только набор хешей, абсолютно бесполезных для получения пароля.


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

А теперь вернемся к теме биткоина и к тому, что же это за компьютерные задачи, решение которых награждает вас заветными биткоинами. Итак, ранее мы сказали, что с помощью хеша нельзя определить ваш пароль. Однако, способ узнать это значение все же есть. Называется он «метод грубой силы» или другими словами - перебор комбинаций до того момента, пока не угадали и значение не совпало с хешем.

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

Хеш обновляется каждые 10 минут, и первый компьютер, решивший задачу, получает вознаграждение. Но на сегодняшний день диапазон чисел, из которых нужно найти верное — огромный. Все биткоин-майнеры мира совместно обрабатывают за минуту примерно 50 000 000 000 000 000 входных значений в секунду в попытке подобрать ключик к заданному хешу.

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

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

В сети Bitcoin и большинстве других современных криптовалют единицей вычислительной мощности является хешрейт. Обрабатывая операции и формируя новые блоки транзакций вычислительная техника производит сложные математические расчеты за решение которых майнер получает определенное количество новых криптомонет. Вся информация о проведенных транзакциях записывается и хранится в истории, которая находится в общем доступе. Задача майнеров состоит в том, чтобы подобрать нужный хеш из всех возможных комбинаций. Этот хеш аналогичен секретному ключу и предоставляет доступ к осуществлению новых операций. Решив задачу майнеру единоразово выплачивается вознаграждение, размер которого строго регламентирован алгоритмом криптовалютной сети. После “закрытия” блока майнер переходит на вычисление нового блока. Как правило, подбором хеша занимается одновременно большое количество устройств, работающие в одном пуле, и как только одно из них находит хеш, то вознаграждение выплачивается пропорционально всей группе, после чего процесс начинается заново.

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

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

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

Как узнать скорость хеширования

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

  • Производитель оборудования. При абсолютно одинаковых технических характеристиках, устройства от различных производителей будут выдавать различный хешрейт.
  • Слот, через который майнер или видеокарта подключены к материнской плате. Бывают случаи, что подключая устройство в разные слоты - скорость хеширования кардинально отличалась.
  • Алгоритм. Оборудование по-разному работает на каждом из используемых алгоритмов. Например, если вычислять на Scrypt-алгоритме, то скорость хеширования будет одна, а если оборудование будет производить вычисления используя SHA, то хешрейт будет совсем другой.

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

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

Заключение

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

Будьте в курсе всех важных событий United Traders - подписывайтесь на наш


Что такое хеш? Хеш-функцией называется математическое преобразование информации в короткую, определенной длины строку.

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

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

Какими характеристиками должна обладать хеш-функция?

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

Какие популярные алгоритмы хеширования? В настоящее время используются следующие хеш-функции:

  • CRC – циклический избыточный код или контрольная сумма. Алгоритм весьма прост, имеет большое количество вариаций в зависимости от необходимой выходной длины. Не является криптографическим!
  • MD 5 – очень популярный алгоритм. Как и его предыдущая версия MD 4 является криптографической функцией. Размер хеша 128 бит.
  • SHA -1 – также очень популярная криптографическаяфункция. Размер хеша 160 бит.
  • ГОСТ Р 34.11-94 – российский криптографический стандарт вычисления хеш-функции. Размер хеша 256 бит.

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

Чем удобнее рассчитывать хеш? Сейчас существует большое количество подобных утилит как платных, так и свободных для использования. Мне лично понравилась HashTab . Во-первых, утилита при установке встраивается в виде вкладки в свойства файлов, во-вторых, позволяет выбирать большое количество алгоритмов хеширования, а в третьих является бесплатной для частного некоммерческого использования.

Что есть российского? Как было сказано выше в России есть стандарт хеширования ГОСТ Р 34.11-94, который повсеместно используется многими производителями средств защиты информации. Одним из таких средств является программа фиксации и контроля исходного состояния программного комплекса «ФИКС». Эта программа является средством контроля эффективности применения СЗИ.

ФИКС (версия 2.0.1) для Windows 9x/NT/2000/XP

  • Вычисление контрольных сумм заданных файлов по одному из 5 реализованных алгоритмов.
  • Фиксация и последующий контроль исходного состояния программного комплекса.
  • Сравнение версий программного комплекса.
  • Фиксация и контроль каталогов.
  • Контроль изменений в заданных файлах (каталогах).
  • Формирование отчетов в форматах TXT, HTML, SV.
  • Изделие имеет сертификат ФСТЭК по НДВ 3 № 913 до 01 июня 2013 г.

А как на счет ЭЦП? Результат вычисленияхеш-функции вместе с секретным ключом пользователя попадает на вход криптографического алгоритма, где и рассчитывается электронно-цифровая подпись. Строго говоря, хеш-функция не является частью алгоритма ЭЦП, но часто это делается специально, для того, чтобы исключить атаку с использованием открытого ключа.

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

Алгоритмы хэширования строк помогают решить очень много задач. Но у них есть большой недостаток: что чаще всего они не 100%-ны, поскольку есть множество строк, хэши которых совпадают. Другое дело, что в большинстве задач на это можно не обращать внимания, поскольку вероятность совпадения хэшей всё-таки очень мала.

Определение хэша и его вычисление

Один из лучших способов определить хэш-функцию от строки S следующий:

H(S) = S + S * P + S * P^2 + S * P^3 + ... + S[N] * P^N

где P - некоторое число.

Разумно выбирать для P простое число, примерно равное количеству символов во входном алфавите. Например, если строки предполаются состоящими только из маленьких латинских букв, то хорошим выбором будет P = 31. Если буквы могут быть и заглавными, и маленькими, то, например, можно P = 53.

Во всех кусках кода в этой статье будет использоваться P = 31.

Само значение хэша желательно хранить в самом большом числовом типе - int64, он же long long. Очевидно, что при длине строки порядка 20 символов уже будет происходить переполнение значение. Ключевой момент - что мы не обращаем внимание на эти переполнения, как бы беря хэш по модулю 2^64.

Пример вычисления хэша, если допустимы только маленькие латинские буквы:

Const int p = 31; long long hash = 0, p_pow = 1; for (size_t i=0; i

В большинстве задач имеет смысл сначала вычислить все нужные степени P в каком-либо массиве.

Пример задачи. Поиск одинаковых строк

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

Обычной сортировкой строк мы бы получили алгоритм со сложностью O (N M log N), в то время как используя хэши, мы получим O (N M + N log N).

Алгоритм. Посчитаем хэш от каждой строки, и отсортируем строки по этому хэшу.

Vector s (n); // ... считывание строк... // считаем все степени p, допустим, до 10000 - максимальной длины строк const int p = 31; vector p_pow (10000); p_pow = 1; for (size_t i=1; i > hashes (n); for (int i=0; i

Хэш подстроки и его быстрое вычисление

Предположим, нам дана строка S, и даны индексы I и J. Требуется найти хэш от подстроки S.

По определению имеем:

H = S[I] + S * P + S * P^2 + ... + S[J] * P^(J-I)

H * P[I] = S[I] * P[I] + ... + S[J] * P[J], H * P[I] = H - H

Полученное свойство является очень важным.

Действительно, получается, что, зная только хэши от всех префиксов строки S, мы можем за O (1) получить хэш любой подстроки .

Единственная возникающая проблема - это то, что нужно уметь делить на P[I]. На самом деле, это не так просто. Поскольку мы вычисляем хэш по модулю 2^64, то для деления на P[I] мы должны найти к нему обратный элемент в поле (например, с помощью Расширенного алгоритма Евклида), и выполнить умножение на этот обратный элемент.

Впрочем, есть и более простой путь. В большинстве случаев, вместо того чтобы делить хэши на степени P, можно, наоборот, умножать их на эти степени .

Допустим, даны два хэша: один умноженный на P[I], а другой - на P[J]. Если I < J, то умножим перый хэш на P, иначе же умножим второй хэш на P. Теперь мы привели хэши к одной степени, и можем их спокойно сравнивать.

Например, код, который вычисляет хэши всех префиксов, а затем за O (1) сравнивает две подстроки:

String s; int i1, i2, len; // входные данные // считаем все степени p const int p = 31; vector i2 && h1 == h2 * p_pow) cout << "equal"; else cout << "different";

Применение хэширования

Вот некоторые типичные применения хэширования:

  • Определение количества различных подстрок за O (N^2 log N) (см. ниже)
  • Определение количества палиндромов внутри строки

Определение количества различных подстрок

Пусть дана строка S длиной N, состоящая только из маленьких латинских букв. Требуется найти количество различных подстрок в этой строке.

Для решения переберём по очереди длину подстроки: L = 1 .. N.

Для каждого L мы построим массив хэшей подстрок длины L, причём приведём хэши к одной степени, и отсортируем этот массив. Количество различных элементов в этом массиве прибавляем к ответу.

Реализация:

String s; // входная строка int n = (int) s.length(); // считаем все степени p const int p = 31; vector p_pow (s.length()); p_pow = 1; for (size_t i=1; iH (s.length()); for (size_t i=0; i hs (n-l+1); for (int i=0; i

Поддержите проект — поделитесь ссылкой, спасибо!
Читайте также
Чем открыть файл fb2 на Андроид? Чем открыть файл fb2 на Андроид? Как найти песню не зная названия и исполнителя Как найти песню не зная названия и исполнителя Что делать, если шумит и трещит жёсткий диск Что делать, если шумит и трещит жёсткий диск