Хэш это: Хеширование – что это и зачем
Хеширование – что это и зачем
Криптографические хеш-функции — незаменимый и повсеместно распространенный инструмент, используемый для выполнения целого ряда задач, включая аутентификацию, проверку целостности данных, защиту файлов и даже обнаружение зловредного ПО. Существует масса алгоритмов хеширования, отличающихся криптостойкостью, сложностью, разрядностью и другими свойствами. Считается, что идея хеширования принадлежит сотруднику IBM, появилась около 50 лет назад и с тех пор не претерпела принципиальных изменений. Зато в наши дни хеширование обрело массу новых свойств и используется в очень многих областях информационных технологий.
Что такое хеш?
Если коротко, то криптографическая хеш-функция, чаще называемая просто хешем, — это математический алгоритм, преобразовывающий произвольный массив данных в состоящую из букв и цифр строку фиксированной длины. Причем при условии использования того же типа хеша длина эта будет оставаться неизменной, вне зависимости от объема вводных данных. Криптостойкой хеш-функция может быть только в том случае, если выполняются главные требования: стойкость к восстановлению хешируемых данных и стойкость к коллизиям, то есть образованию из двух разных массивов данных двух одинаковых значений хеша. Интересно, что под данные требования формально не подпадает ни один из существующих алгоритмов, поскольку нахождение обратного хешу значения — вопрос лишь вычислительных мощностей. По факту же в случае с некоторыми особо продвинутыми алгоритмами этот процесс может занимать чудовищно много времени.
Как работает хеш?
Например, мое имя — Brian — после преобразования хеш-функцией SHA-1 (одной из самых распространенных наряду с MD5 и SHA-2) при помощи онлайн-генератора будет выглядеть так: 75c450c3f963befb912ee79f0b63e563652780f0. Как вам скажет, наверное, любой другой Брайан, данное имя нередко пишут с ошибкой, что в итоге превращает его в слово brain (мозг). Это настолько частая опечатка, что однажды я даже получил настоящие водительские права, на которых вместо моего имени красовалось Brain Donohue. Впрочем, это уже другая история. Так вот, если снова воспользоваться алгоритмом SHA-1, то слово Brain трансформируется в строку 97fb724268c2de1e6432d3816239463a6aaf8450. Как видите, результаты значительно отличаются друг от друга, даже несмотря на то, что разница между моим именем и названием органа центральной нервной системы заключается лишь в последовательности написания двух гласных. Более того, если я преобразую тем же алгоритмом собственное имя, но написанное уже со строчной буквы, то результат все равно не будет иметь ничего общего с двумя предыдущими: 760e7dab2836853c63805033e514668301fa9c47.
Впрочем, кое-что общее у них все же есть: каждая строка имеет длину ровно 40 символов. Казалось бы, ничего удивительного, ведь все введенные мною слова также имели одинаковую длину — 5 букв. Однако если вы захешируете весь предыдущий абзац целиком, то все равно получите последовательность, состоящую ровно из 40 символов: c5e7346089419bb4ab47aaa61ef3755d122826e2. То есть 1128 символов, включая пробелы, были ужаты до строки той же длины, что и пятибуквенное слово. То же самое произойдет даже с полным собранием сочинений Уильяма Шекспира: на выходе вы получите строку из 40 букв и цифр. При всем этом не может существовать двух разных массивов данных, которые преобразовывались бы в одинаковый хеш.
Вот как это выглядит, если изобразить все вышесказанное в виде схемы:
Для чего используется хеш?
Отличный вопрос. Однако ответ не так прост, поскольку криптохеши используются для огромного количества вещей.
Для нас с вами, простых пользователей, наиболее распространенная область применения хеширования — хранение паролей. К примеру, если вы забыли пароль к какому-либо онлайн-сервису, скорее всего, придется воспользоваться функцией восстановления пароля. В этом случае вы, впрочем, не получите свой старый пароль, поскольку онлайн-сервис на самом деле не хранит пользовательские пароли в виде обычного текста. Вместо этого он хранит их в виде хеш-значений. То есть даже сам сервис не может знать, как в действительности выглядит ваш пароль. Исключение составляют только те случаи, когда пароль очень прост и его хеш-значение широко известно в кругах взломщиков. Таким образом, если вы, воспользовавшись функцией восстановления, вдруг получили старый пароль в открытом виде, то можете быть уверены: используемый вами сервис не хеширует пользовательские пароли, что очень плохо.
Вы даже можете провести простой эксперимент: попробуйте при помощи специального сайта произвести преобразование какого-нибудь простого пароля вроде «123456» или «password» из их хеш-значений (созданных алгоритмом MD5) обратно в текст. Вероятность того, что в базе хешей найдутся данные о введенных вами простых паролях, очень высока. В моем случае хеши слов «brain» (8b373710bcf876edd91f281e50ed58ab) и «Brian» (4d236810821e8e83a025f2a83ea31820) успешно распознались, а вот хеш предыдущего абзаца — нет. Отличный пример, как раз для тех, кто все еще использует простые пароли.
Еще один пример, покруче. Не так давно по тематическим сайтам прокатилась новость о том, что популярный облачный сервис Dropbox заблокировал одного из своих пользователей за распространение контента, защищенного авторскими правами. Герой истории тут же написал об этом в твиттере, запустив волну негодования среди пользователей сервиса, ринувшихся обвинять Dropbox в том, что он якобы позволяет себе просматривать содержимое клиентских аккаунтов, хотя не имеет права этого делать.
Впрочем, необходимости в этом все равно не было. Дело в том, что владелец защищенного копирайтом контента имел на руках хеш-коды определенных аудио- и видеофайлов, запрещенных к распространению, и занес их в черный список хешей. Когда пользователь предпринял попытку незаконно распространить некий контент, автоматические сканеры Dropbox засекли файлы, чьи хеши оказались в пресловутом списке, и заблокировали возможность их распространения.
Где еще можно использовать хеш-функции помимо систем хранения паролей и защиты медиафайлов? На самом деле задач, где используется хеширование, гораздо больше, чем я знаю и тем более могу описать в одной статье. Однако есть одна особенная область применения хешей, особо близкая нам как сотрудникам «Лаборатории Касперского»: хеширование широко используется для детектирования зловредных программ защитным ПО, в том числе и тем, что выпускается нашей компанией.
Как при помощи хеша ловить вирусы?
Примерно так же, как звукозаписывающие лейблы и кинопрокатные компании защищают свой контент, сообщество создает черные списки зловредов (многие из них доступны публично), а точнее, списки их хешей. Причем это может быть хеш не всего зловреда целиком, а лишь какого-либо его специфического и хорошо узнаваемого компонента. С одной стороны, это позволяет пользователю, обнаружившему подозрительный файл, тут же внести его хеш-код в одну из подобных открытых баз данных и проверить, не является ли файл вредоносным. С другой — то же самое может сделать и антивирусная программа, чей «движок» использует данный метод детектирования наряду с другими, более сложными.
Криптографические хеш-функции также могут использоваться для защиты от фальсификации передаваемой информации. Иными словами, вы можете удостовериться в том, что файл по пути куда-либо не претерпел никаких изменений, сравнив его хеши, снятые непосредственно до отправки и сразу после получения. Если данные были изменены даже всего на 1 байт, хеш-коды будут отличаться, как мы уже убедились в самом начале статьи. Недостаток такого подхода лишь в том, что криптографическое хеширование требует больше вычислительных мощностей или времени на вычисление, чем алгоритмы с отсутствием криптостойкости. Зато они в разы надежнее.
Кстати, в повседневной жизни мы, сами того не подозревая, иногда пользуемся простейшими хешами. Например, представьте, что вы совершаете переезд и упаковали все вещи по коробкам и ящикам. Погрузив их в грузовик, вы фиксируете количество багажных мест (то есть, по сути, количество коробок) и запоминаете это значение. По окончании выгрузки на новом месте, вместо того чтобы проверять наличие каждой коробки по списку, достаточно будет просто пересчитать их и сравнить получившееся значение с тем, что вы запомнили раньше. Если значения совпали, значит, ни одна коробка не потерялась.
Хэш-алгоритмы / Хабр
Как я полагаю, многим известно о том, что с 2007 года Национальный институт стандартов и технологий США (NIST) проводит конкурс на разработку хэш-алгоритма для замены SHA-1, и семейства алгоритмов SHA-2. Однако данная тема, почему-то обделена вниманием на сайте. Собственно это и привело меня к вам. Предлагаю вашему вниманию цикл статей, посвященных хэш-алгоритмам. В этом цикле мы вместе изучим основы хэш-функций, рассмотрим самые именитые хэш-алгоритмы, окунемся в атмосферу конкурса SHA-3 и рассмотрим алгоритмы, претендующие на победу в нем, обязательно их потестируем. Так же по возможности будут рассмотрены российские стандарты хеширования.
О себе
Студент кафедры информационной безопасности.
О хэшировании
В настоящее время практически ни одно приложение криптографии не обходится без использования хэширования.
Хэш-функции – это функции, предназначенные для «сжатия» произвольного сообщения или набора данных, записанных, как правило, в двоичном алфавите, в некоторую битовую комбинацию фиксированной длины, называемую сверткой. Хэш-функции имеют разнообразные применения при проведении статистических экспериментов, при тестировании логических устройств, при построении алгоритмов быстрого поиска и проверки целостности записей в базах данных. Основным требованием к хэш-функциям является равномерность распределения их значений при случайном выборе значений аргумента.
Криптографической хеш-функцией называется всякая хеш-функция, являющаяся криптостойкой, то есть удовлетворяющая ряду требований специфичных для криптографических приложений. В криптографии хэш-функции применяются для решения следующих задач:
— построения систем контроля целостности данных при их передаче или хранении,
— аутентификация источника данных.
Хэш-функцией называется всякая функция h:X -> Y, легко вычислимая и такая, что для любого сообщения M значение h(M) = H (свертка) имеет фиксированную битовую длину. X — множество всех сообщений, Y — множество двоичных векторов фиксированной длины.
Как правило хэш-функции строят на основе так называемых одношаговых сжимающих функций y = f(x1, x2) двух переменных, где x1, x2 и y — двоичные векторы длины m, n и n соответственно, причем n — длина свертки, а m — длина блока сообщения.
Для получения значения h(M) сообщение сначала разбивается на блоки длины m (при этом, если длина сообщения не кратна m то последний блок неким специальным образом дополняется до полного), а затем к полученным блокам M1, M2,.., MN применяют следующую последовательную процедуру вычисления свертки:
Ho = v,
Hi = f(Mi,Hi-1), i = 1,.., N,
h(M) = HN
Здесь v — некоторая константа, часто ее называют инициализирующим вектором. Она выбирается
из различных соображений и может представлять собой секретную константу или набор случайных данных (выборку даты и времени, например).
При таком подходе свойства хэш-функции полностью определяются свойствами одношаговой сжимающей функции.
Выделяют два важных вида криптографических хэш-функций — ключевые и бесключевые. Ключевые хэш-функции называют кодами аутентификации сообщений. Они дают возможность без дополнительных средств гарантировать как правильность источника данных, так и целостность данных в системах с доверяющими друг другу пользователями.
Бесключевые хэш-функции называются кодами обнаружения ошибок. Они дают возможность с помощью дополнительных средств (шифрования, например) гарантировать целостность данных. Эти хэш-функции могут применяться в системах как с доверяющими, так и не доверяющими друг другу пользователями.
О статистических свойствах и требованиях
Как я уже говорил основным требованием к хэш-функциям является равномерность распределения их значений при случайном выборе значений аргумента. Для криптографических хеш-функций также важно, чтобы при малейшем изменении аргумента значение функции сильно изменялось. Это называется лавинным эффектом.
К ключевым функциям хэширования предъявляются следующие требования:
— невозможность фабрикации,
— невозможность модификации.
Первое требование означает высокую сложность подбора сообщения с правильным значением свертки. Второе — высокую сложность подбора для заданного сообщения с известным значением свертки другого сообщения с правильным значением свертки.
К бесключевым функциям предъявляют требования:
— однонаправленность,
— устойчивость к коллизиям,
— устойчивость к нахождению второго прообраза.
Под однонаправленностью понимают высокую сложность нахождения сообщения по заданному значению свертки. Следует заметить что на данный момент нет используемых хэш-функций с доказанной однонаправленностью.
Под устойчивостью к коллизиям понимают сложность нахождения пары сообщений с одинаковыми значениями свертки. Обычно именно нахождение способа построения коллизий криптоаналитиками служит первым сигналом устаревания алгоритма и необходимости его скорой замены.
Под устойчивостью к нахождению второго прообраза понимают сложность нахождения второго сообщения с тем же значением свертки для заданного сообщения с известным значением свертки.
Это была теоретическая часть, которая пригодится нам в дальнейшем…
О популярных хэш-алгоритмах
Алгоритмы CRC16/32 — контрольная сумма (не криптографическое преобразование).
Алгоритмы MD2/4/5/6. Являются творением Рона Райвеста, одного из авторов алгоритма RSA.
Алгоритм MD5 имел некогда большую популярность, но первые предпосылки взлома появились еще в конце девяностых, и сейчас его популярность стремительно падает.
Алгоритм MD6 — очень интересный с конструктивной точки зрения алгоритм. Он выдвигался на конкурс SHA-3, но, к сожалению, авторы не успели довести его до кондиции, и в списке кандидатов, прошедших во второй раунд этот алгоритм отсутствует.
Алгоритмы линейки SHA Широко распространенные сейчас алгоритмы. Идет активный переход от SHA-1 к стандартам версии SHA-2. SHA-2 — собирательное название алгоритмов SHA224, SHA256, SHA384 и SHA512. SHA224 и SHA384 являются по сути аналогами SHA256 и SHA512 соответственно, только после расчета свертки часть информации в ней отбрасывается. Использовать их стоит лишь для обеспечения совместимости с оборудованием старых моделей.
Российский стандарт — ГОСТ 34.11-94.
В следующей статье
Обзор алгоритмов MD (MD4, MD5, MD6).
Литература
А. П. Алферов, Основы криптографии.
Брюс Шнайер, Прикладная криптография.
Что такое Хэширование? Под капотом блокчейна / Хабр
Очень многие из вас, наверное, уже слышали о технологии блокчейн, однако важно знать о принципе работы хэширования в этой системе. Технология Блокчейн является одним из самых инновационных открытий прошлого века. Мы можем так заявить без преувеличения, так как наблюдаем за влиянием, которое оно оказало на протяжении последних нескольких лет, и влиянием, которое оно будет иметь в будущем. Для того чтобы понять устройство и предназначение самой технологии блокчейн, сначала мы должны понять один из основных принципов создания блокчейна.
Так что же такое хэширование?
Простыми словами, хэширование означает ввод информации любой длины и размера в исходной строке и выдачу результата фиксированной длины заданной алгоритмом функции хэширования. В контексте криптовалют, таких как Биткоин, транзакции после хэширования на выходе выглядят как набор символов определённой алгоритмом длины (Биткоин использует SHA-256).
Input- вводимые данные, hash- хэш
Посмотрим, как работает процесс хэширования. Мы собираемся внести определенные данные. Для этого, мы будем использовать SHA-256 (безопасный алгоритм хэширования из семейства SHA-2, размером 256 бит).
Как видите, в случае SHA-256, независимо от того, насколько объёмные ваши вводимые данные (input), вывод всегда будет иметь фиксированную 256-битную длину. Это крайне необходимо, когда вы имеете дело с огромным количеством данных и транзакций. Таким образом, вместо того, чтобы помнить вводимые данные, которые могут быть огромными, вы можете просто запомнить хэш и отслеживать его. Прежде чем продолжать, необходимо познакомиться с различными свойствами функций хэширования и тем, как они реализуются в блокчейн.
Криптографические хэш-функции
Криптографическая хэш-функция — это специальный класс хэш-функций, который имеет различные свойства, необходимые для криптографии. Существуют определенные свойства, которые должна иметь криптографическая хэш-функция, чтобы считаться безопасной. Давайте разберемся с ними по очереди.
Свойство 1: Детерминированние
Это означает, что независимо от того, сколько раз вы анализируете определенный вход через хэш-функцию, вы всегда получите тот же результат. Это важно, потому что если вы будете получать разные хэши каждый раз, будет невозможно отслеживать ввод.
Свойство 2: Быстрое вычисление
Хэш-функция должна быть способна быстро возвращать хэш-вход. Если процесс не достаточно быстрый, система просто не будет эффективна.
Свойство 3: Сложность обратного вычисления
Сложность обратного вычисления означает, что с учетом H (A) невозможно определить A, где A – вводимые данные и H(А) – хэш. Обратите внимание на использование слова “невозможно” вместо слова “неосуществимо”. Мы уже знаем, что определить исходные данные по их хэш-значению можно. Возьмем пример.
Предположим, вы играете в кости, а итоговое число — это хэш числа, которое появляется из кости. Как вы сможете определить, что такое исходный номер? Просто все, что вам нужно сделать, — это найти хэши всех чисел от 1 до 6 и сравнить. Поскольку хэш-функции детерминированы, хэш конкретного номера всегда будет одним и тем же, поэтому вы можете просто сравнить хэши и узнать исходный номер.
Но это работает только тогда, когда данный объем данных очень мал. Что происходит, когда у вас есть огромный объем данных? Предположим, вы имеете дело с 128-битным хэшем. Единственный метод, с помощью которого вы должны найти исходные данные, — это метод «грубой силы». Метод «грубой силы» означает, что вам нужно выбрать случайный ввод, хэшировать его, а затем сравнить результат с исследуемым хэшем и повторить, пока не найдете совпадение.
Итак, что произойдет, если вы используете этот метод?
- Лучший сценарий: вы получаете свой ответ при первой же попытке. Вы действительно должны быть самым счастливым человеком в мире, чтобы это произошло. Вероятность такого события ничтожна.
- Худший сценарий: вы получаете ответ после 2 ^ 128 — 1 раз. Это означает, что вы найдете свой ответ в конце всех вычислений данных (один шанс из 340282366920938463463374607431768211456)
- Средний сценарий: вы найдете его где-то посередине, поэтому в основном после 2 ^ 128/2 = 2 ^ 127 попыток. Иными словами, это огромное количество.
Таким образом, можно пробить функцию обратного вычисления с помощью метода «грубой силы», но потребуется очень много времени и вычислительных ресурсов, поэтому это бесполезно.
Свойство 4: Небольшие изменения в вводимых данных изменяют хэш
Даже если вы внесете небольшие изменения в исходные данные, изменения, которые будут отражены в хэше, будут огромными. Давайте проверим с помощью SHA-256:
Видите? Даже если вы только что изменили регистр первой буквы, обратите внимание, насколько это повлияло на выходной хэш. Это необходимая функция, так как свойство хэширования приводит к одному из основных качеств блокчейна – его неизменности (подробнее об этом позже).
Свойство 5: Коллизионная устойчивость
Учитывая два разных типа исходных данных A и B, где H (A) и H (B) являются их соответствующими хэшами, для H (A) не может быть равен H (B). Это означает, что, по большей части, каждый вход будет иметь свой собственный уникальный хэш. Почему мы сказали «по большей части»? Давайте поговорим об интересной концепции под названием «Парадокс дня рождения».
Что такое парадокс дня рождения?
Если вы случайно встречаете незнакомца на улице, шанс, что у вас совпадут даты дней рождений, очень мал. Фактически, если предположить, что все дни года имеют такую же вероятность дня рождения, шансы другого человека, разделяющего ваш день рождения, составляют 1/365 или 0,27%. Другими словами, он действительно низкий.
Однако, к примеру, если собрать 20-30 человек в одной комнате, шансы двух людей, разделяющих тот же день, резко вырастает. На самом деле, шанс для 2 человек 50-50, разделяющих тот же день рождения при таком раскладе.
Как это применяется в хэшировании?
Предположим, у вас есть 128-битный хэш, который имеет 2 ^ 128 различных вероятностей. Используя парадокс дня рождения, у вас есть 50% шанс разбить коллизионную устойчивость sqrt (2 ^ 128) = 2 ^ 64.
Как вы заметили, намного легче разрушить коллизионную устойчивость, нежели найти обратное вычисление хэша. Для этого обычно требуется много времени. Итак, если вы используете такую функцию, как SHA-256, можно с уверенностью предположить, что если H (A) = H (B), то A = B.
Свойство 6: Головоломка
Свойства Головоломки имеет сильнейшее воздействие на темы касающиеся криптовалют (об этом позже, когда мы углубимся в крипто схемы). Сначала давайте определим свойство, после чего мы подробно рассмотрим каждый термин.
Для каждого выхода «Y», если k выбран из распределения с высокой мин-энтропией, невозможно найти вводные данные x такие, что H (k | x) = Y.
Вероятно, это, выше вашего понимания! Но все в порядке, давайте теперь разберемся с этим определением.
В чем смысл «высокой мин-энтропии»?
Это означает, что распределение, из которого выбрано значение, рассредоточено так, что мы выбираем случайное значение, имеющее незначительную вероятность. В принципе, если вам сказали выбрать число от 1 до 5, это низкое распределение мин-энтропии. Однако, если бы вы выбрали число от 1 до бесконечности, это — высокое распределение мин-энтропии.
Что значит «к|х»?
«|» обозначает конкатенацию. Конкатенация означает объединение двух строк. Например. Если бы я объединила «голубое» и «небо», то результатом было бы «голубоенебо».
Итак, давайте вернемся к определению.
Предположим, у вас есть выходное значение «Y». Если вы выбираете случайное значение «К», невозможно найти значение X, такое, что хэш конкатенации из K и X, выдаст в результате Y.
Еще раз обратите внимание на слово «невозможно», но не исключено, потому что люди занимаются этим постоянно. На самом деле весь процесс майнинга работает на этом (подробнее позже).
Примеры криптографических хэш-функций:
- MD 5: Он производит 128-битный хэш. Коллизионная устойчивость была взломана после ~2^21 хэша.
- SHA 1: создает 160-битный хэш. Коллизионная устойчивость была взломана после ~2^61 хэша.
- SHA 256: создает 256-битный хэш. В настоящее время используется в Биткоине.
- Keccak-256: Создает 256-битный хэш и в настоящее время используется Эфириуме.
Хэширование и структуры данных.
Структура данных — это специализированный способ хранения данных. Если вы хотите понять, как работает система «блокчейн», то есть два основных свойства структуры данных, которые могут помочь вам в этом:
1. Указатели
2. Связанные списки
Указатели
В программировании указатели — это переменные, в которых хранится адрес другой переменной, независимо от используемого языка программирования.
Например, запись int a = 10 означает, что существует некая переменная «a», хранящая в себе целочисленное значение равное 10. Так выглядит стандартная переменная.
Однако, вместо сохранения значений, указатели хранят в себе адреса других переменных. Именно поэтому они и получили свое название, потому как буквально указывают на расположение других переменных.
Связанные списки
Связанный список является одним из наиболее важных элементов в структурах данных. Структура связанного списка выглядит следующим образом:
*Head – заголовок; Data – данные; Pointer – указатель; Record – запись; Null – ноль
Это последовательность блоков, каждый из которых содержит данные, связанные со следующим с помощью указателя. Переменная указателя в данном случае содержит адрес следующего узла, благодаря чему выполняется соединение. Как показано на схеме, последний узел отмечен нулевым указателем, что означает, что он не имеет значения.
Важно отметить, что указатель внутри каждого блока содержит адрес предыдущего. Так формируется цепочка. Возникает вопрос, что это значит для первого блока в списке и где находится его указатель?
Первый блок называется «блоком генезиса», а его указатель находится в самой системе. Выглядит это следующим образом:
*H ( ) – Хэшированные указатели изображаются таким образом
Если вам интересно, что означает «хэш-указатель», то мы с радостью поясним.
Как вы уже поняли, именно на этом основана структура блокчейна. Цепочка блоков представляет собой связанный список. Рассмотрим, как устроена структура блокчейна:
* Hash of previous block header – хэш предыдущего заголовка блока; Merkle Root – Корень Меркла; Transactions – транзакции; Simplified Bitcoin Blockchain – Упрощенный блокчейн Биткоина.
Блокчейн представляет собой связанный список, содержащий данные, а так же указатель хэширования, указывающий на предыдущий блок, создавая таким образов связную цепочку. Что такое хэш-указатель? Он похож на обычный указатель, но вместо того, чтобы просто содержать адрес предыдущего блока, он также содержит хэш данных, находящихся внутри предыдущего блока. Именно эта небольшая настройка делает блокчейн настолько надежным. Представим на секунду, что хакер атакует блок 3 и пытается изменить данные. Из-за свойств хэш-функций даже небольшое изменение в данных сильно изменит хэш. Это означает, что любые незначительные изменения, произведенные в блоке 3, изменят хэш, хранящийся в блоке 2, что, в свою очередь, изменит данные и хэш блока 2, а это приведет к изменениям в блоке 1 и так далее. Цепочка будет полностью изменена, а это невозможно. Но как же выглядит заголовок блока?
* Prev_Hash – предыдущий хэш; Tx – транзакция; Tx_Root – корень транзакции; Timestamp – временная отметка; Nonce – уникальный символ.
Заголовок блока состоит из следующих компонентов:
· Версия: номер версии блока
· Время: текущая временная метка
· Текущая сложная цель (См. ниже)
· Хэш предыдущего блока
· Уникальный символ (См. ниже)
· Хэш корня Меркла
Прямо сейчас, давайте сосредоточимся на том, что из себя представляет хэш корня Меркла. Но до этого нам необходимо разобраться с понятием Дерева Меркла.
Что такое Дерево Меркла?
Источник: Wikipedia
На приведенной выше диаграмме показано, как выглядит дерево Меркла. В дереве Меркла каждый нелистовой узел является хэшем значений их дочерних узлов.
Листовой узел: Листовые узлы являются узлами в самом нижнем ярусе дерева. Поэтому, следуя приведенной выше схеме, листовыми будут считаться узлы L1, L2, L3 и L4.
Дочерние узлы: Для узла все узлы, находящиеся ниже его уровня и которые входят в него, являются его дочерними узлами. На диаграмме узлы с надписью «Hash 0-0» и «Hash 0-1» являются дочерними узлами узла с надписью «Hash 0».
Корневой узел: единственный узел, находящийся на самом высоком уровне, с надписью «Top Hash» является корневым.
Так какое же отношение Дерево Меркла имеет к блокчейну?
Каждый блок содержит большое количество транзакций. Будет очень неэффективно хранить все данные внутри каждого блока в виде серии. Это сделает поиск какой-либо конкретной операции крайне громоздким и займет много времени. Но время, необходимое для выяснения, на принадлежность конкретной транзакции к этому блоку или нет, значительно сокращается, если Вы используете дерево Меркла.
Давайте посмотрим на пример на следующем Хэш-дереве:
Изображение предоставлено проектом: Coursera
Теперь предположим, я хочу узнать, принадлежат ли эти данные блоку или нет:
Вместо того, чтобы проходить через сложный процесс просматривания каждого отдельного процесса хэша, а также видеть принадлежит ли он данным или нет, я просто могу отследить след хэша, ведущий к данным:
Это значительно сокращает время.
Хэширование в майнинге: крипто-головоломки.
Когда мы говорим «майнинг», в основном, это означает поиск нового блока, который будет добавлен в блокчейн. Майнеры всего мира постоянно работают над тем, чтобы убедиться, что цепочка продолжает расти. Раньше людям было проще работать, используя для майнинга лишь свои ноутбуки, но со временем они начали формировать «пулы», объединяя при этом мощность компьютеров и майнеров, что может стать проблемой. Существуют ограничения для каждой криптовалюты, например, для биткоина они составляют 21 миллион. Между созданием каждого блока должен быть определенный временной интервал заданный протоколом. Для биткоина время между созданием блока занимает всего 10 минут. Если бы блокам было разрешено создаваться быстрее, это привело бы к:
- Большому количеству коллизий: будет создано больше хэш-функций, которые неизбежно вызовут больше коллизий.
- Большому количеству брошенных блоков: Если много майнеров пойдут впереди протокола, они будут одновременно хаотично создавать новые блоки без сохранения целостности основной цепочки, что приведет к «осиротевшим» блокам.
Таким образом, чтобы ограничить создание блоков, устанавливается определенный уровень сложности. Майнинг чем-то напоминает игру: решаешь задачу – получаешь награду. Усиление сложности делает решение задачи намного сложнее и, следовательно, на нее затрачивается большее количество времени.WRT, которая начинается с множества нулей. При увеличении уровня сложности, увеличивается количество нулей. Уровень сложности изменяется после каждого 2016-го блока.
Процесс Майнинга
Примечание: в этом разделе мы будем говорить о выработке биткоинов.
Когда протокол Биткоина хочет добавить новый блок в цепочку, майнинг – это процедура, которой он следует. Всякий раз, когда появляется новый блок, все их содержимое сначала хэшируется. Если подобранный хэш больше или равен, установленному протоколом уровню сложности, он добавляется в блокчейн, а все в сообществе признают новый блок.
Однако, это не так просто. Вам должно очень повезти, чтобы получить новый блок таким образом. Так как, именно здесь присваивается уникальный символ. Уникальный символ (nonce) — это одноразовый код, который объединен с хэшем блока. Затем эта строка вновь меняется и сравнивается с уровнем сложности. Если она соответствует уровню сложности, то случайный код изменяется. Это повторяется миллион раз до тех пор, пока требования не будут наконец выполнены. Когда же это происходит, то блок добавляется в цепочку блоков.
Подводя итоги:
• Выполняется хэш содержимого нового блока.
• К хэшу добавляется nonce (специальный символ).
• Новая строка снова хэшируется.
• Конечный хэш сравнивается с уровнем сложности, чтобы проверить меньше он его или нет
• Если нет, то nonce изменяется, и процесс повторяется снова.
• Если да, то блок добавляется в цепочку, а общедоступная книга (блокчейн) обновляется и сообщает нодам о присоединении нового блока.
• Майнеры, ответственные за данный процесс, награждаются биткоинами.
Помните номер свойства 6 хэш-функций? Удобство использования задачи?
Для каждого выхода «Y», если k выбран из распределения с высокой мин-энтропией, невозможно найти вход x таким образом, H (k | x) = Y.
Так что, когда дело доходит до майнинга биткоинов:
• К = Уникальный символ
• x = хэш блока
• Y = цель проблемы
Весь процесс абсолютно случайный, основанный на генерации случайных чисел, следующий протоколу Proof Of Work и означающий:
- Решение задач должно быть сложным.
- Однако проверка ответа должна быть простой для всех. Это делается для того, чтобы убедиться, что для решения проблемы не использовались недозволенные методы.
Что такое скорость хэширования?
Скорость хэширования в основном означает, насколько быстро эти операции хэширования происходят во время майнинга. Высокий уровень хэширования означает, что в процессе майнинга участвуют всё большее количество людей и майнеров, и в результате система функционирует нормально. Если скорость хэширования слишком высокая, уровень сложности пропорционально увеличивается. Если скорость хэша слишком медленная, то соответственно, уровень сложности уменьшается.
Вывод
Хэширование действительно является основополагающим в создании технологии блокчейн. Если кто-то хочет понять, что такое блокчейн, он должен начать с того, чтобы понять, что означает хэширование.
что это такое простыми словами
Хэш или хэш-функция – одна из основных составляющих современной криптографии и алгоритма блокчейна.
Хэширование представляет собой преобразование любого объема информации в уникальный набор символов, который присущ только этому массиву входящей информации. Этот набор символов и будет называться хэшем.
Свойства хэша
У хэш-функции есть несколько обязательных свойств:
- Хэш всегда уникален для каждого массива информации. Однако иногда случаются так называемые коллизии, когда для разных входных блоков информации вычисляются одинаковые хэш-коды.
- При самом незначительном изменении входной информации ее хэш полностью меняется.
- Хэш-функция необратима и не позволяет восстанавливать исходный массив информации из символьной строки. Это можно сделать, только перебрав все возможные варианты, что при бесконечном количестве информации требует много времени и денег.
- Хэширование позволяет достаточно быстро вычислить нужный хэш для достаточно большого объема информации.
- Алгоритм работы хэш-функции, как правило, делается открытым, чтобы при необходимости можно было оценить ее стойкость к восстановлению начальных данных по выдаваемому хэшу.
- Хэш-функция должна уметь приводить любой объем данных к числу заданной длины.
Практическое использование хэша
Работа с большими объемами информации
Такой пример не часто встречается в реальной работе, но он наглядно показывает, насколько хэш-функция может облегчить работу с большими объемами информации.
Например, в массив из нескольких миллионов разных строк длиной 1 млн символов нужно добавить еще одну, при условии, что там ее еще нет. Чтобы не заниматься посимвольным сравнением каждой строки, можно предварительно вычислить хэш каждой из них, и уже сделать сравнение по нему. Вся работа упрощается и ускоряется в разы.
Проверка целостности данных при передаче
Для таких проверок часто используются простые хэш-функции.
Например, один пользователь передает другому определенный массив данных, а затем хэш от него. Получатель информации, захэшировав информацию у себя и сравнив хэши, может удостовериться, что он получил именно те данные, которые были отправлены.
В технологии блокчейн хэш также используется для проверки целостности данных. Хэш выступает гарантией целостности цепочки транзакций (платежей) и защищает ее от несанкционированных изменений. Благодаря ему и распределенным вычислениям взломать блокчен очень сложно.
Шифрование
На практике некоторые хэш-функции также используются для шифрования. Благодаря практически полностью хаотичному соответствию хэшей исходным данным, практически невозможно вычислить начальный массив данных. Такие хэш-функции должны быть очень стойкими к коллизиям, т.е. должна обладать минимальной вероятностью получения двух одинаковых хэшей для двух разных массивов данных. Расчеты по таким алгоритмам более сложные и требует больше времени, но зато отличаются надежностью.
Электронные цифровые подписи
Использование хэша в данной технологии позволяет пользователю, который подписывает документ, быть уверенным, что он подписывает именно тот документ, который требуется. Также хэш используется при формировании электронной цифровой подписи и аутентификации пользователей.
Хранение паролей
Для доступа к сайтам и серверам по логину и паролю тоже часто используют хэширование.
Пользователь регистрируется на сайте:
- Заполняет форму регистрации, включая поле Пароль,
- Пароль обрабатывается хэш-функцией и помещается в базу данных,
- Оригинальное значение пароля нигде не используется.
Пользователь входит на сайт:
- Вводит свой логин и пароль,
- Пароль хэшируется и сравнивается с данными базы,
- Если хэши совпадают, пользователя заходит на сайт.
Для такого типа хэширования, как правило, применяются сложные функции с очень высокой криптостойкостью, которые не позволяют подобрать пароль по хэшу.
Хеш — что это такое и как хэш-функция помогает решать вопросы безопасности в интернете
Здравствуйте, уважаемые читатели блога KtoNaNovenkogo.ru. Хочу продолжить серию статей посвященных различным терминам, которые не всегда могут быть понятны без дополнительных пояснений. Чуть ранее я рассказывал про то, что значит слово кликбейт и что такое хост, писал про IP и MAC адреса, фишинг и многое другое.
Сегодня у нас на очереди хеш. Что это такое? Зачем он нужен? Почему это слово так часто используется в интернете применительно к совершенно разным вещам? Имеет ли это какое-то отношение к хештегам или хешссылкам? Где применяют хэш, как вы сами можете его использовать? Что такое хэш-функция и хеш-сумма? Причем тут коллизии?
Все это (или почти все) вы узнаете из этой маленькой заметки. Поехали…
Что такое хеш и хэширование простыми словами
Слово хеш происходит от английского «hash», одно из значений которого трактуется как путаница или мешанина. Собственно, это довольно полно описывает реальное значение этого термина. Часто еще про такой процесс говорят «хеширование», что опять же является производным от английского hashing (рубить, крошить, спутывать и т.п.).
Появился этот термин в середине прошлого века среди людей занимающихся обработках массивов данных. Хеш-функция позволяла привести любой массив данных к числу заданной длины. Например, если любое число (любой длинны) начать делить много раз подряд на одно и то же простое число (это как?), то полученный в результате остаток от деления можно будет называть хешем. Для разных исходных чисел остаток от деления (цифры после запятой) будет отличаться.
Для обычного человека это кажется белибердой, но как ни странно в наше время без хеширования практически невозможна работа в интернете. Так что же это такая за функция? На самом деле она может быть любой (приведенный выше пример это не есть реальная функция — он придуман мною чисто для вашего лучшего понимания принципа). Главное, чтобы результаты ее работы удовлетворяли приведенным ниже условиям.
Зачем нужен хэш
Смотрите, еще пример. Есть у вас текст в файле. Но на самом деле это ведь не текст, а массив цифровых символов (по сути число). Как вы знаете, в компьютерной логике используются двоичные числа (ноль и единица). Они запросто могут быть преобразованы в шестнадцатиричные цифры, над которыми можно проводить математические операции. Применив к ним хеш-функцию мы получим на выходе (после ряда итераций) число заданной длины (хеш-сумму).
Если мы потом в исходном текстовом файле поменяем хотя бы одну букву или добавим лишний пробел, то повторно рассчитанный для него хэш уже будет отличаться от изначального (вообще другое число будет). Доходит, зачем все это нужно? Ну, конечно же, для того, чтобы понять, что файл именно тот, что и должен быть. Это можно использовать в целом ряде аспектов работы в интернете и без этого вообще сложно представить себе работу сети.
Где и как используют хеширование
Например, простые хэш-функции (не надежные, но быстро рассчитываемые) применяются при проверке целостности передачи пакетов по протоколу TCP/IP (и ряду других протоколов и алгоритмов, для выявления аппаратных ошибок и сбоев — так называемое избыточное кодирование). Если рассчитанное значение хеша совпадает с отправленным вместе с пакетом (так называемой контрольной суммой), то значит потерь по пути не было (можно переходить к следующему пакету).
А это, ведь на минутку, основной протокол передачи данных в сети интернет. Без него никуда. Да, есть вероятность, что произойдет накладка — их называют коллизиями. Ведь для разных изначальных данных может получиться один и тот же хеш. Чем проще используется функция, тем выше такая вероятность. Но тут нужно просто выбирать между тем, что важнее в данный момент — надежность идентификации или скорость работы. В случае TCP/IP важна именно скорость. Но есть и другие области, где важнее именно надежность.
Похожая схема используется и в технологии блокчейн, где хеш выступает гарантией целостности цепочки транзакций (платежей) и защищает ее от несанкционированных изменений. Благодаря ему и распределенным вычислениям взломать блокчен очень сложно и на его основе благополучно существует множество криптовалют, включая самую популярную из них — это биткоин. Последний существует уже с 2009 год и до сих пор не был взломан.
Более сложные хеш-функции используются в криптографии. Главное условие для них — невозможность по конечному результату (хэшу) вычислить начальный (массив данных, который обработали данной хеш-функцией). Второе главное условие — стойкость к коллизиями, т.е. низкая вероятность получения двух одинаковых хеш-сумм из двух разных массивов данных при обработке их этой функцией. Расчеты по таким алгоритмам более сложные, но тут уже главное не скорость, а надежность.
Так же хеширование используется в технологии электронной цифровой подписи. С помощью хэша тут опять же удостоверяются, что подписывают именно тот документ, что требуется. Именно он (хеш) передается в токен, который и формирует электронную цифровую подпись. Но об этом, я надеюсь, еще будет отдельная статья, ибо тема интересная, но в двух абзацах ее не раскроешь.
Для доступа к сайтам и серверам по логину и паролю тоже часто используют хеширование. Согласитесь, что хранить пароли в открытом виде (для их сверки с вводимыми пользователями) довольно ненадежно (могут их похитить). Поэтому хранят хеши всех паролей. Пользователь вводит символы своего пароля, мгновенно рассчитывается его хеш-сумма и сверяется с тем, что есть в базе. Надежно и очень просто. Обычно для такого типа хеширования используют сложные функции с очень высокой криптостойкостью, чтобы по хэшу нельзя было бы восстановить пароль.
Какими свойствами должна обладать хеш-функция
Хочу систематизировать кое-что из уже сказанного и добавить новое.
- Как уже было сказано, функция эта должна уметь приводить любой объем данных (а все они цифровые, т.е. двоичные, как вы понимаете) к числу заданной длины (по сути это сжатие до битовой последовательности заданной длины хитрым способом).
- При этом малейшее изменение (хоть на один бит) входных данных должно приводить к полному изменению хеша.
- Она должна быть стойкой в обратной операции, т.е. вероятность восстановления исходных данных по хешу должна быть весьма низкой (хотя последнее сильно зависит от задействованных мощностей)
- В идеале она должна иметь как можно более низкую вероятность возникновения коллизий. Согласитесь, что не айс будет, если из разных массивов данных будут часто получаться одни и те же значения хэша.
- Хорошая хеш-функция не должна сильно нагружать железо при своем исполнении. От этого сильно зависит скорость работы системы на ней построенной. Как я уже говорил выше, всегда имеется компромисс между скорость работы и качеством получаемого результата.
- Алгоритм работы функции должен быть открытым, чтобы любой желающий мог бы оценить ее криптостойкость, т.е. вероятность восстановления начальных данных по выдаваемому хешу.
Хеш — это маркер целостности скачанных в сети файлов
Где еще можно встретить применение этой технологии? Наверняка при скачивании файлов из интернета вы сталкивались с тем, что там приводят некоторые числа (которые называют либо хешем, либо контрольными суммами) типа:
CRC32: 7438E546 MD5: DE3BAC46D80E77ADCE8E379F682332EB SHA-1: 332B317FB97126B0F79F7AF5786EBC51E5CC82CF
Что это такое? И что вам с этим всем делать? Ну, как правило, на тех же сайтах можно найти пояснения по этому поводу, но я не буду вас утруждать и расскажу в двух словах. Это как раз и есть результаты работы различных хеш-функций (их названия приведены перед числами: CRC32, MD5 и SHA-1).
Зачем они вам нужны? Ну, если вам важно знать, что при скачивании все прошло нормально и ваша копия полностью соответствует оригиналу, то нужно будет поставить на свой компьютер программку, которая умеет вычислять хэш по этим алгоритмам (или хотя бы по некоторым их них).
После чего прогнать скачанные файлы через эту программку и сравнить полученные числа с приведенными на сайте. Если совпадают, то сбоев при скачивании не было, а если нет, то значит были сбои и есть смысл повторить закачку заново.
Популярные хэш-алгоритмы сжатия
- CRC32 — используется именно для создания контрольных сумм (так называемое избыточное кодирование). Данная функция не является криптографической. Есть много вариаций этого алгоритма (число после CRC означает длину получаемого хеша в битах), в зависимости от нужной длины получаемого хеша. Функция очень простая и нересурсоемкая. В связи с этим используется для проверки целостности пакетов в различных протоколах передачи данных.
- MD5 — старая, но до сих пор очень популярная версия уже криптографического алгоритма, которая создает хеш длиной в 128 бит. Хотя стойкость этой версии на сегодняшний день и не очень высока, она все равно часто используется как еще один вариант контрольной суммы, например, при скачивании файлов из сети.
- SHA-1 — криптографическая функция формирующая хеш-суммы длиной в 160 байт. Сейчас идет активная миграция в сторону SHA-2, которая обладает более высокой устойчивостью, но SHA-1 по-прежнему активно используется хотя бы в качестве контрольных сумм. Но она так же по-прежнему используется и для хранения хешей паролей в базе данных сайта (об этом читайте выше).
- ГОСТ Р 34.11-2012 — текущий российский криптографический (стойкий к взлому) алгоритм введенный в работу в 2013 году (ранее использовался ГОСТ Р 34.11-94). Длина выходного хеша может быть 256 или 512 бит. Обладает высокой криптостойкостью и довольно хорошей скоростью работы. Используется для электронных цифровых подписей в системе государственного и другого документооборота.
HashTab — вычисление хеша для любых файлов на компьютере
Раз уж зашла речь о программе для проверки целостности файлов (расчета контрольных сумм по разным алгоритмам хеширования), то тут, наверное, самым популярным решением будет HashTab.
Она бесплатна для личного некоммерческого использования и покрывает с лихвой все, что вам может понадобиться от подобного рода софта. После ее скачивания и установки запускать ничего не надо. Просто кликаете правой кнопкой мыши по нужному файлу в Проводнике (или ТоталКомандере) и выбираете самый нижний пункт выпадающего меню «Свойства»:
В открывшемся окне перейдите на вкладку «Хеш-суммы файлов», где будут отображены контрольные суммы, рассчитанные по нужным вам алгоритмам хэширования (задать их можно нажав на кнопку «Настройки» в этом же окне). По умолчанию отображаются три самых популярных:
Чтобы не сравнивать контрольные суммы визуально, можно числа по очереди вставить в рассположенное ниже поле (со знаком решетки) и нажать на кнопку «Сравнить файл».
Как видите, все очень просто и быстро. А главное эффективно.
Удачи вам! До скорых встреч на страницах блога KtoNaNovenkogo.ru
Использую для заработка
Рубрика: ЧАстые ВОпросы
Что такое хеш и хэширование простыми словами.: spayte — LiveJournal
Сегодня у нас на очереди хеш. Что это такое? Зачем он нужен? Почему это слово так часто используется в интернете применительно к совершенно разным вещам? Имеет ли это какое-то отношение к хештегам или хешссылкам? Где применяют хэш, как вы сами можете его использовать? Что такое хэш-функция и хеш-сумма? Причем тут коллизии?
«>
Все это (или почти все) вы узнаете из этой маленькой заметки. Поехали…
Что такое хеш и хэширование простыми словами
Слово хеш происходит от английского «hash», одно из значений которого трактуется как путаница или мешанина. Собственно, это довольно полно описывает реальное значение этого термина. Часто еще про такой процесс говорят «хеширование», что опять же является производным от английского hashing (рубить, крошить, спутывать и т.п.).
Появился этот термин в середине прошлого века среди людей занимающихся обработках массивов данных. Хеш-функция позволяла привести любой массив данных к числу заданной длины. Например, если любое число (любой длинны) начать делить много раз подряд на одно и то же простое число, то полученный в результате остаток от деления можно будет называть хешем. Для разных исходных чисел остаток от деления (цифры после запятой) будет отличаться.
Для обычного человека это кажется белибердой, но как ни странно в наше время без хеширования практически невозможна работа в интернете. Так что же это такая за функция? На самом деле она может быть любой (приведенный выше пример это не есть реальная функция — он придуман мною чисто для вашего лучшего понимания принципа). Главное, чтобы результаты ее работы удовлетворяли приведенным ниже условиям.
Зачем нужен хэш
Смотрите, еще пример. Есть у вас текст в файле. Но на самом деле это ведь не текст, а массив цифровых символов (по сути число). Как вы знаете, в компьютерной логике используются двоичные числа (ноль и единица). Они запросто могут быть преобразованы в шестнадцатиричные цифры, над которыми можно проводить математические операции. Применив к ним хеш-функцию мы получим на выходе (после ряда итераций) число заданной длины (хеш-сумму).
Если мы потом в исходном текстовом файле поменяем хотя бы одну букву или добавим лишний пробел, то повторно рассчитанный для него хэш уже будет отличаться от изначального (вообще другое число будет). Доходит, зачем все это нужно? Ну, конечно же, для того, чтобы понять, что файл именно тот, что и должен быть. Это можно использовать в целом ряде аспектов работы в интернете и без этого вообще сложно представить себе работу сети.
Где и как используют хеширование
Например, простые хэш-функции (не надежные, но быстро рассчитываемые) применяются при проверке целостности передачи пакетов по протоколу TCP/IP (и ряду других протоколов и алгоритмов, для выявления аппаратных ошибок и сбоев — так называемое избыточное кодирование). Если рассчитанное значение хеша совпадает с отправленным вместе с пакетом (так называемой контрольной суммой), то значит потерь по пути не было (можно переходить к следующему пакету).
А это, ведь на минутку, основной протокол передачи данных в сети интернет. Без него никуда. Да, есть вероятность, что произойдет накладка — их называют коллизиями. Ведь для разных изначальных данных может получиться один и тот же хеш. Чем проще используется функция, тем выше такая вероятность. Но тут нужно просто выбирать между тем, что важнее в данный момент — надежность идентификации или скорость работы. В случае TCP/IP важна именно скорость. Но есть и другие области, где важнее именно надежность.
Похожая схема используется и в технологии блокчейн, где хеш выступает гарантией целостности цепочки транзакций (платежей) и защищает ее от несанкционированных изменений. Благодаря ему и распределенным вычислениям взломать блокчен очень сложно и на его основе благополучно существует множество криптовалют, включая самую популярную из них — это биткоин. Последний существует уже с 2009 год и до сих пор не был взломан.
Более сложные хеш-функции используются в криптографии. Главное условие для них — невозможность по конечному результату (хэшу) вычислить начальный (массив данных, который обработали данной хеш-функцией). Второе главное условие — стойкость к коллизиями, т.е. низкая вероятность получения двух одинаковых хеш-сумм из двух разных массивов данных при обработке их этой функцией. Расчеты по таким алгоритмам более сложные, но тут уже главное не скорость, а надежность.
Так же хеширование используется в технологии электронной цифровой подписи. С помощью хэша тут опять же удостоверяются, что подписывают именно тот документ, что требуется. Именно он (хеш) передается в токен, который и формирует электронную цифровую подпись. Но об этом, я надеюсь, еще будет отдельная статья, ибо тема интересная, но в двух абзацах ее не раскроешь.
Для доступа к сайтам и серверам по логину и паролю тоже часто используют хеширование. Согласитесь, что хранить пароли в открытом виде (для их сверки с вводимыми пользователями) довольно ненадежно (могут их похитить). Поэтому хранят хеши всех паролей. Пользователь вводит символы своего пароля, мгновенно рассчитывается его хеш-сумма и сверяется с тем, что есть в базе. Надежно и очень просто. Обычно для такого типа хеширования используют сложные функции с очень высокой криптостойкостью, чтобы по хэшу нельзя было бы восстановить пароль.
Какими свойствами должна обладать хеш-функция
Хочу систематизировать кое-что из уже сказанного и добавить новое.
- Как уже было сказано, функция эта должна уметь приводить любой объем данных (а все они цифровые, т.е. двоичные, как вы понимаете) к числу заданной длины (по сути это сжатие до битовой последовательности заданной длины хитрым способом).
- При этом малейшее изменение (хоть на один бит) входных данных должно приводить к полному изменению хеша.
- Она должна быть стойкой в обратной операции, т.е. вероятность восстановления исходных данных по хешу должна быть весьма низкой (хотя последнее сильно зависит от задействованных мощностей)
- В идеале она должна иметь как можно более низкую вероятность возникновения коллизий. Согласитесь, что не айс будет, если из разных массивов данных будут часто получаться одни и те же значения хэша.
- Хорошая хеш-функция не должна сильно нагружать железо при своем исполнении. От этого сильно зависит скорость работы системы на ней построенной. Как я уже говорил выше, всегда имеется компромисс между скорость работы и качеством получаемого результата.
- Алгоритм работы функции должен быть открытым, чтобы любой желающий мог бы оценить ее криптостойкость, т.е. вероятность восстановления начальных данных по выдаваемому хешу.
Хеш — это маркер целостности скачанных в сети файлов
Где еще можно встретить применение этой технологии? Наверняка при скачивании файлов из интернета вы сталкивались с тем, что там приводят некоторые числа (которые называют либо хешем, либо контрольными суммами) типа:
CRC32: 7438E546
MD5: DE3BAC46D80E77ADCE8E379F682332EB
SHA-1: 332B317FB97126B0F79F7AF5786EBC51E5CC82CF
Что это такое? И что вам с этим всем делать? Ну, как правило, на тех же сайтах можно найти пояснения по этому поводу, но я не буду вас утруждать и расскажу в двух словах. Это как раз и есть результаты работы различных хеш-функций (их названия приведены перед числами: CRC32, MD5 и SHA-1).
Зачем они вам нужны? Ну, если вам важно знать, что при скачивании все прошло нормально и ваша копия полностью соответствует оригиналу, то нужно будет поставить на свой компьютер программку, которая умеет вычислять хэш по этим алгоритмам (или хотя бы по некоторым их них).
После чего прогнать скачанные файлы через эту программку и сравнить полученные числа с приведенными на сайте. Если совпадают, то сбоев при скачивании не было, а если нет, то значит были сбои и есть смысл повторить закачку заново.
Популярные хэш-алгоритмы сжатия
- CRC32 — используется именно для создания контрольных сумм (так называемое избыточное кодирование). Данная функция не является криптографической. Есть много вариаций этого алгоритма (число после CRC означает длину получаемого хеша в битах), в зависимости от нужной длины получаемого хеша. Функция очень простая и нересурсоемкая. В связи с этим используется для проверки целостности пакетов в различных протоколах передачи данных.
- MD5 — старая, но до сих пор очень популярная версия уже криптографического алгоритма, которая создает хеш длиной в 128 бит. Хотя стойкость этой версии на сегодняшний день и не очень высока, она все равно часто используется как еще один вариант контрольной суммы, например, при скачивании файлов из сети.
- SHA-1 — криптографическая функция формирующая хеш-суммы длиной в 160 байт. Сейчас идет активная миграция в сторону SHA-2, которая обладает более высокой устойчивостью, но SHA-1 по-прежнему активно используется хотя бы в качестве контрольных сумм. Но она так же по-прежнему используется и для хранения хешей паролей в базе данных сайта (об этом читайте выше).
- ГОСТ Р 34.11-2012 — текущий российский криптографический (стойкий к взлому) алгоритм введенный в работу в 2013 году (ранее использовался ГОСТ Р 34.11-94). Длина выходного хеша может быть 256 или 512 бит. Обладает высокой криптостойкостью и довольно хорошей скоростью работы. Используется для электронных цифровых подписей в системе государственного и другого документооборота.
HashTab — вычисление хеша для любых файлов на компьютере
Раз уж зашла речь о программе для проверки целостности файлов (расчета контрольных сумм по разным алгоритмам хеширования), то тут, наверное, самым популярным решением будет HashTab.
Она бесплатна для личного некоммерческого использования и покрывает с лихвой все, что вам может понадобиться от подобного рода софта. После ее скачивания и установки запускать ничего не надо. Просто кликаете правой кнопкой мыши по нужному файлу в Проводнике (или ТоталКомандере) и выбираете самый нижний пункт выпадающего меню «Свойства»:
В открывшемся окне перейдите на вкладку «Хеш-суммы файлов», где будут отображены контрольные суммы, рассчитанные по нужным вам алгоритмам хэширования (задать их можно нажав на кнопку «Настройки» в этом же окне). По умолчанию отображаются три самых популярных:
Чтобы не сравнивать контрольные суммы визуально, можно числа по очереди вставить в рассположенное ниже поле (со знаком решетки) и нажать на кнопку «Сравнить файл».
Как видите, все очень просто и быстро. А главное эффективно.
Что такое хеш и для чего он нужен?
Что такое хеш?Хеш-функцией называется математическое преобразование информации в короткую, определенной длины строку.
Зачем это нужно?Анализ при помощи хеш-функций часто используют для контроля целостности важных файлов операционной системы, важных программ, важных данных. Контроль может производиться как по необходимости, так и на регулярной основе.
Как это делается?Вначале определяют, целостность каких файлов нужно контролировать. Для каждого файла производится вычисления значения его хеша по специальному алгоритму с сохранением результата. Через необходимое время производится аналогичный расчет и сравниваются результаты. Если значения отличаются, значит информация содержащаяся в файле была изменена.
Какими характеристиками должна обладать хеш-функция?
- должна уметь выполнять преобразования данных произвольной длины в фиксированную;
- должна иметь открытый алгоритм, чтобы можно было исследовать её криптостойкость;
- должна быть односторонней, то есть не должно быть математической возможности по результату определить исходные данные;
- должна «сопротивляться» коллизиям, то есть не должна выдавать одинаковых значений при разных входных данных;
- не должна требовать больших вычислительных ресурсов;
- при малейшем изменении входных данных результат должен существенно изменяться.
Какие популярные алгоритмы хеширования?В настоящее время используются следующие хеш-функции:
- CRC– циклический избыточный код или контрольная сумма. Алгоритм весьма прост, имеет большое количество вариаций в зависимости от необходимой выходной длины. Не является криптографическим!
- MD5 – очень популярный алгоритм. Как и его предыдущая версия MD4 является криптографической функцией. Размер хеша 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) без технической возможности извлечения его оттуда. Сам токен имеет весьма ограниченную область памяти, измеряемую в килобайтах. Для подписания документа нет никакой возможности передать документ в сам токен, а вот передать хеш документа в токен и на выходе получить ЭЦП очень просто.
Hash It — средство вычисления контрольной суммы файла
Hash It — это небольшой, но быстрый инструмент, который поможет вам узнать хэши файлов MD5 и SHA-1. Он работает в Windows 98, Me, 2000, XP и Vista. Вы можете добавить его в контекстное меню, вызываемое правой кнопкой мыши в проводнике Windows, чтобы вы могли быстро щелкнуть правой кнопкой мыши любой файл и вычислить хэши. В настоящее время он поддерживает только алгоритмы хеширования MD5 и SHA-1, но вскоре будет добавлен и SHA-256.
Зачем использовать Hash It?
Многие серверы загрузки, особенно те, которые связаны с сообществом разработчиков ПО с открытым исходным кодом, предоставляют хэши MD5 и SHA-1 загружаемых вами файлов.Контрольная сумма хеш-кода файла остается неизменной, если она не изменена. Если даже один байт этого файла изменяется, контрольная сумма хэша изменяется, указывая на то, что файл был изменен и не совпадает с автором или издателем программного обеспечения, предназначенного для загрузки. Изменение файла может произойти из-за проблем с сетью или из-за вируса или вредоносной программы, изменяющих файл.
Вы можете найти контрольную сумму MD5 или SHA-1 файла с помощью инструмента Hash It и сопоставить контрольную сумму с той, которая была предоставлена издателем программного обеспечения.Если они такие же, у вас есть неизмененное программное обеспечение, которое издатель разместил на своем веб-сайте.
Установка Hash It
Hash It не поставляется с какой-либо программой установки или установщиком. Причина в том, что он на самом деле не нужен. Все, что вам нужно, — это распаковать его в папку и начать использовать. Следующие шаги описывают, как установить (?) Hash It на ваш компьютер.
- Загрузите Hash It на свой компьютер. (Перейдите в раздел Загрузки, чтобы найти ссылки для загрузки)
- Распакуйте его в любую папку на жестком диске.Это не должна быть временная папка. Не запускайте его из zip-файла. Запуск его из zip-файла заставляет архиватор (например, WinRAR, WinZip и т. Д.) Копировать файлы во временную папку, которая удаляется при закрытии окна архиватора.
- Запустите Hash It , дважды щелкнув файл HashIt.exe .
Примечание: Если вы хотите добавить его в контекстное меню Windows, щелкнув правой кнопкой мыши, то вам необходимо запустить HashIt.exe с правами администратора в первый раз.В Windows XP вам необходимо запустить учетную запись администратора при первом запуске Hash It . В Windows Vista щелкните правой кнопкой мыши HashIt.exe и выберите Запуск от имени администратора , как показано на рисунке: - Чтобы добавить контекстное меню, вызываемое щелчком правой кнопкой мыши, просто установите флажок Добавить в контекстное меню . Чтобы удалить контекстное меню позже, просто снимите этот же флажок. (Прочтите шаг 3 перед тем, как сделать это)
Удаление Hash It
Hash It не требует деинсталлятора.Просто выполните следующие действия, чтобы удалить Hash It из вашей системы:
- Запустите Hash It с правами администратора (прочтите шаг 3 в предыдущем разделе) .
- Снимите флажок Добавить в контекстное меню и закройте Hash it .
- Удалить файл HashIt.exe .
Использование Hash It
Использование Hash It очень просто. Если вы не добавляли его в контекстное меню, щелкнув правой кнопкой мыши, просто запустите Hash It и нажмите крошечную кнопку с эллипсами (три точки), как показано на рисунке ниже:
Это приведет к появлению диалогового окна открытия файла.Выберите нужный файл и щелкните Откройте , как показано:
Hash It начнет вычислять хэш выбранного файла и по завершении отобразит результат.
Если вы добавили его в контекстное меню, просто щелкните правой кнопкой мыши любой файл в проводнике Windows и выберите Calculate Hash , как показано на рисунке:
.
Безопасное хеширование паролей с добавлением соли — как это сделать правильно
Поиск хэша (яблоко) в пользовательском хеш-списке …: Соответствует [alice3, 0bob0, charles8]
Поиск хеш-кода (черника) в пользовательском хеш-списке …: Соответствует [usr10101, timmy, john91]
Поиск hash (letmein) в списке хэшей пользователей …: Соответствует [wilson10, dragonslayerX, joe1984]
Поиск хэша (s3cr3t) в списке хэшей пользователей …: Соответствует [bruce19, knuth2337, john87]
Поиск хэша ( z @ 29hjja) в хеш-списке пользователей…: Ни один пользователь не использовал этот пароль
Эта атака позволяет злоумышленнику применить атаку по словарю или перебором к множеству хэшей одновременно, без предварительного вычисления таблицы поиска.
Сначала злоумышленник создает таблицу поиска, которая отображает каждый хэш пароля из
скомпрометированная база данных учетных записей пользователей в список пользователей, у которых был этот хэш.
Затем злоумышленник хеширует каждое предположение пароля и использует таблицу поиска для
получить список пользователей, чей пароль угадал злоумышленник.Эта атака
особенно эффективен, потому что у многих пользователей обычно одинаковые
пароль.
Радужные столы
Радужные таблицы — это техника компромисса между временем и памятью. Они похожи на поиск
таблицы, за исключением того, что они приносят в жертву скорость взлома хэша, чтобы поиск
столы меньше. Поскольку они меньше, решения для большего количества хэшей могут
хранить на том же пространстве, что делает их более эффективными. Радуга
существуют таблицы, которые могут взломать любой хэш md5 пароля длиной до 8 символов.
Далее мы рассмотрим технику, называемую солением, которая делает невозможным использование
таблицы поиска и радужные таблицы для взлома хеша.
Добавление соли
хэш ( «Привет») = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
хэш ( «Привет» + «QxLUF1bgIAdeQX») = 9e209040c863f84a31e719795b2577523954739fe5ed3b58a75cff2127075ed1
хэш ( «Привет» + «bv5PehSMfV11Cd») = d1d3ec2e6f20fd420d50e2642992841d8338a314b8ea157c9e18477aaef226ab
хэш ( «Привет» + «YYLmfY6IehjZMQ») = a49670c3c18b9e079b9cfaf51634f563dc8ae3070db2c4a8544305df1b60f007
Таблицы поиска и радужные таблицы работают только потому, что каждый пароль хешируется
точно так же.Если у двух пользователей одинаковый пароль, они будут иметь одинаковый пароль.
хеши паролей. Мы можем предотвратить эти атаки, рандомизируя каждый хэш, чтобы
когда один и тот же пароль хешируется дважды, хеши не совпадают.
Мы можем рандомизировать хэши, добавляя или добавляя случайную строку, называемую
соль , к паролю перед хешированием. Как показано в примере выше, это
каждый раз преобразует один и тот же хэш пароля в совершенно другую строку. Чтобы
проверяем, правильный ли пароль, нам нужна соль, поэтому обычно она хранится в
база данных учетных записей пользователей вместе с хешем или как часть самой хеш-строки.
Соль не обязательно должна быть секретной. Просто путем рандомизации хэшей поиск
таблицы, таблицы обратного просмотра и радужные таблицы становятся неэффективными. An
злоумышленник не будет знать заранее, какова будет соль, поэтому они не могут предварительно вычислить
таблица поиска или таблица радуги. Если пароль каждого пользователя хешируется с
другая соль, атака по таблице обратного поиска тоже не сработает.
В следующем разделе мы рассмотрим, как соль обычно используется неправильно.
НЕПРАВИЛЬНЫЙ способ: короткое повторное использование соли и соли
Наиболее распространенные ошибки реализации соли — это повторное использование одной и той же соли в нескольких
хеши или использование слишком короткой соли.
Повторное использование соли
Распространенная ошибка — использовать одну и ту же соль в каждом хэше. Либо соль
жестко запрограммированы в программе или генерируются случайным образом один раз. Это неэффективно
потому что, если у двух пользователей один и тот же пароль, у них все равно будет один и тот же хэш.
Злоумышленник может использовать атаку по таблице обратного просмотра для запуска словаря.
атака на каждый хэш одновременно. Им просто нужно нанести соль на каждый
угадайте пароль, прежде чем они его хэшируют. Если соль жестко закодирована в популярном
продукта, таблицы поиска и радужные таблицы могут быть построены для этой соли, чтобы сделать ее
легче взламывать хеши, сгенерированные продуктом.
Новая случайная соль должна генерироваться каждый раз, когда пользователь создает учетную запись или меняет свой пароль.
Соль короткая
Если соль слишком короткая, злоумышленник может построить таблицу поиска для каждого
возможна соль. Например, если соль состоит только из трех символов ASCII, там
всего 95x95x95 = 857 375 возможных солей. Может показаться, что это много, но если
каждая таблица поиска содержит только 1 МБ наиболее распространенных паролей вместе
они будут всего 837 ГБ, что немного, учитывая, что жесткие диски на 1000 ГБ могут
можно купить менее чем за 100 долларов сегодня.
По той же причине имя пользователя не должно использоваться в качестве соли. Имена пользователей могут быть
уникальны для одной службы, но они предсказуемы и часто используются повторно для
аккаунты на других сервисах. Злоумышленник может создавать таблицы поиска для общих
имена пользователей и использовать их для взлома хэшей с добавлением имени пользователя.
Чтобы злоумышленник не мог создать таблицу поиска для каждого
возможна соль, соль должна быть длинной. Хорошее практическое правило — использовать соль,
того же размера, что и результат хэш-функции.Например, вывод
SHA256 составляет 256 бит (32 байта), поэтому соль должна быть не менее 32 случайных байтов.
НЕПРАВИЛЬНЫЙ способ: двойное хеширование и дурацкие хеш-функции
В этом разделе рассматривается еще одно распространенное заблуждение, связанное с хешированием паролей:
комбинации хеш-алгоритмов. Легко увлечься и попробовать
комбинируйте разные хеш-функции, надеясь, что результат будет более надежным. В
Однако на практике от этого мало пользы. Все, что он делает, это
создают проблемы совместимости, а иногда даже могут сделать хеши меньше
безопасный.Никогда не пытайтесь изобрести собственную криптовалюту, всегда используйте стандарт, который
разработан специалистами. Некоторые будут утверждать, что использование нескольких хеш-функций
замедляет процесс вычисления хэша, поэтому взлом происходит медленнее, но
есть лучший способ замедлить процесс взлома, как мы увидим позже.
Вот несколько примеров плохих дурацких хэш-функций, которые я видел на форумах в Интернете.
- md5 (sha1 (пароль))
- md5 (md5 (соль) + md5 (пароль))
- sha1 (sha1 (пароль))
- sha1 (str_rot13 (пароль + соль))
- md5 (sha1 (md5 (md5 (пароль) + sha1 (пароль)) + md5 (пароль)))
Не используйте ничего из этого.
Примечание: этот раздел оказался противоречивым. Я получил несколько
электронные письма, в которых утверждается, что дурацкие хеш-функции — это хорошо, потому что так лучше
если злоумышленник не знает, какая хеш-функция используется, это меньше
Вероятно, злоумышленник заранее вычислил радужную таблицу для дурацкого хэша
функция, и вычисление хеш-функции занимает больше времени.
Злоумышленник не может атаковать хэш, если он не знает алгоритм, но обратите внимание на алгоритм Керкхоффса.
принцип, что злоумышленник обычно имеет доступ к исходному коду
(особенно если это бесплатное программное обеспечение или программное обеспечение с открытым исходным кодом), и это с учетом некоторых
пары пароль-хэш из целевой системы, отменить несложно
разработать алгоритм.На вычисление дурацких хэш-функций уходит больше времени, но
только на небольшой постоянный коэффициент. Лучше использовать итерационный алгоритм, который
разработан так, чтобы его было чрезвычайно трудно распараллелить (это обсуждается ниже). А также,
правильное засоление хеша решает проблему радужной таблицы.
Если вы действительно хотите использовать стандартизированную «дурацкую» хеш-функцию, такую как HMAC, тогда ничего страшного.
Но если вы делаете это для того, чтобы замедлить вычисление хэша, сначала прочтите раздел ниже о растяжении ключей.
Сравните эти незначительные преимущества с рисками случайного внедрения
совершенно небезопасная хеш-функция и проблемы с совместимостью дурацкие хеши
Создайте. Очевидно, что лучше всего использовать стандартный и хорошо протестированный алгоритм.
Хэш-коллизии
Поскольку хэш-функции отображают произвольные объемы данных в строки фиксированной длины,
должны быть некоторые входные данные, которые хешируются в ту же строку. Криптографический хеш
функции разработаны, чтобы сделать эти столкновения невероятно трудными для обнаружения.Время от времени криптографы обнаруживают «атаки» на хеш-функции, которые делают
легче обнаруживать столкновения. Недавний пример — хеш-функция MD5, для которой
столкновения действительно обнаружены.
Атаки столкновения — признак того, что это может быть более вероятно для строки, отличной от
пароль пользователя должен иметь такой же хеш. Однако обнаружение столкновений даже в
слабая хеш-функция, такая как MD5, требует много выделенной вычислительной мощности, поэтому
очень маловероятно, что на практике эти столкновения произойдут «случайно».А
хеширование пароля с использованием MD5 и соли для всех практических целей так же, как
безопасный, как если бы он был хеширован с помощью SHA256 и соли. Тем не менее, это хороший
идея использовать более безопасную хеш-функцию, такую как SHA256, SHA512, RipeMD или
Гидравлический бассейн, если возможно.
Правильный способ: как правильно хешировать
В этом разделе описано, как именно хешировать пароли. Первый
подраздел охватывает основы — все, что абсолютно необходимо. В
в следующих подразделах объясняется, как можно расширить основы для создания хэшей.
даже сложнее взломать.
Основы: хеширование с использованием соли
Предупреждение: не просто читайте этот раздел. Вы обязательно должны реализовать
в следующем разделе: «Усложнение взлома паролей: медленное хеширование
Функции ».
Мы видели, как злонамеренные хакеры могут очень быстро взламывать простые хэши, используя
таблицы поиска и радужные таблицы. Мы узнали, что рандомизация хеширования
использование соли — это решение проблемы. Но как нам получить соль, и
как применить это к паролю?
Соль должна генерироваться с использованием псевдослучайной криптографической защиты .
Генератор чисел (CSPRNG).CSPRNG сильно отличаются от обычных
генераторы псевдослучайных чисел, такие как язык «C»
rand () функция. Как следует из названия, CSPRNG являются
разработаны для криптографической безопасности, что означает, что они обеспечивают высокий уровень
случайность и совершенно непредсказуемы. Мы не хотим, чтобы наши соли были
предсказуемо, поэтому мы должны использовать CSPRNG. В следующей таблице перечислены некоторые CSPRNG.
которые существуют для некоторых популярных платформ программирования.
Соль должна быть уникальной для каждого пользователя и каждого пароля. Каждый раз, когда пользователь создает учетную запись или
меняет свой пароль, пароль должен быть хеширован с использованием новой случайной соли.Никогда не используйте соль повторно.
Соль тоже должна быть длинной, чтобы было много возможных солей. Как правило, сделайте свой
соль не меньше длины вывода хеш-функции. Соль должна храниться у пользователя
таблица счетов рядом с хешем.
для хранения пароля
- Сгенерировать длинную случайную соль с помощью CSPRNG.
- Добавьте соль к паролю и хешируйте его с помощью стандартной функции хеширования паролей , такой как Argon2, bcrypt, scrypt или PBKDF2.
- Сохраните соль и хэш в записи базы данных пользователя.
Подтверждение пароля
- Получить соль и хэш пользователя из базы данных.
- Добавьте соль к данному паролю и хэшируйте его, используя ту же хеш-функцию.
- Сравните хэш данного пароля с хешем из базы данных. Если они совпадают, пароль правильный. В противном случае пароль неверный.
В веб-приложении всегда хеш на сервере
Если вы пишете веб-приложение, вам может быть интересно, , где для хеширования.Если пароль хешируется в браузере пользователя с помощью JavaScript, или должен
отправить его на сервер «в открытом виде» и там хешировать?
Даже если вы хешируете пароли пользователей в JavaScript, у вас все еще есть
для хеширования хешей на сервере. Рассмотрим веб-сайт, на котором хешируются
пароли в браузере пользователя без хеширования хешей на сервере. Чтобы
аутентифицировать пользователя, этот веб-сайт примет хэш от браузера и проверит
если этот хеш в точности совпадает с хешем в базе данных.Это кажется более безопасным
чем просто хеширование на сервере, поскольку пароли пользователей никогда не отправляются
сервер, но это не так.
Проблема в том, что хэш на стороне клиента логически становится пользовательским.
пароль. Все, что нужно сделать пользователю для аутентификации, — это сообщить серверу хэш
своего пароля. Если злоумышленник получил хэш пользователя , он мог бы использовать его для
пройти аутентификацию на сервере, не зная пароля пользователя! Итак, если плохо
парень каким-то образом ворует базу хешей с этого гипотетического сайта,
они получат немедленный доступ ко всем учетным записям без необходимости угадывать
пароли.
Это не означает, что вы не должны хешировать в браузере, но если вы
сделать, вам обязательно нужно хешировать на сервере. Хеширование в браузере есть
конечно, хорошая идея, но учтите следующие моменты для вашей реализации:
Хеширование паролей на стороне клиента — это , а не вместо HTTPS.
(SSL / TLS). Если соединение между браузером и сервером установлено
небезопасно, человек посередине может изменить код JavaScript как есть
загружен, чтобы удалить функцию хеширования и получить пользовательский
пароль.Некоторые веб-браузеры не поддерживают JavaScript, а некоторые пользователи отключают
JavaScript в их браузере. Поэтому для максимальной совместимости ваше приложение
должен определять, поддерживает ли браузер JavaScript, и эмулировать
хэш на стороне клиента на сервере, если это не так.Вам также нужно солить хэши на стороне клиента. Очевидное решение —
заставить клиентский сценарий запрашивать у сервера соль пользователя.Не делай
это потому, что он позволяет злоумышленникам проверять, действительно ли имя пользователя без
зная пароль. Поскольку вы перемешиваете и солите (с хорошим
соль) на сервере тоже, можно использовать имя пользователя (или адрес электронной почты)
объединены со строкой для конкретного сайта (например, доменным именем) в качестве
клиентская соль.
Усложнение взлома паролей: медленное хеширование
Salt гарантирует, что злоумышленники не смогут использовать специализированные атаки, такие как таблицы поиска.
и радужные таблицы для быстрого взлома больших коллекций хэшей, но
не мешает им запускать атаки по словарю или перебора на каждый
хеш индивидуально.Высококачественные видеокарты (GPU) и специальное оборудование могут
вычисляют миллиарды хэшей в секунду, поэтому эти атаки все еще очень
эффективный. Чтобы сделать эти атаки менее эффективными, мы можем использовать прием
известный как растяжение ключа .
Идея состоит в том, чтобы сделать хеш-функцию очень медленной, чтобы даже при быстром
GPU или специальное оборудование, атаки по словарю и перебором слишком медленны для
быть стоящим. Цель состоит в том, чтобы сделать хэш-функцию достаточно медленной, чтобы препятствовать
атакует, но достаточно быстро, чтобы не вызывать заметной задержки у пользователя.
Растяжение ключа реализовано с помощью специального типа хеш-кода, интенсивно использующего процессор.
функция. Не пытайтесь придумывать свои собственные — просто итеративно хешируйте
хеша пароля недостаточно, так как его можно распараллелить аппаратно и
выполняется так же быстро, как и обычный хеш. Используйте стандартный алгоритм, например PBKDF2 или bcrypt.
Вы можете найти PHP-реализацию PBKDF2 здесь.
Эти алгоритмы принимают в качестве аргумента фактор безопасности или количество итераций.
Это значение определяет, насколько медленной будет хеш-функция.Для рабочего стола
программного обеспечения или приложений для смартфонов, лучший способ выбрать этот параметр — запустить
короткий тест на устройстве, чтобы найти значение, которое заставляет хэш
около полсекунды. Таким образом, ваша программа может быть максимально безопасной.
не влияя на пользовательский опыт.
Если вы используете хэш растяжения ключа в веб-приложении, имейте в виду, что вы
потребуются дополнительные вычислительные ресурсы для обработки больших объемов
запросы аутентификации, и это растяжение ключа может упростить запуск
Атака отказа в обслуживании (DoS) на ваш сайт.Я все еще рекомендую использовать ключ
растягивание, но с меньшим количеством итераций. Вы должны рассчитать
количество итераций на основе ваших вычислительных ресурсов и ожидаемого
максимальная частота запросов аутентификации. Угроза отказа в обслуживании может быть
устраняется, заставляя пользователя вводить CAPTCHA каждый раз при входе в систему.
Всегда проектируйте свою систему так, чтобы количество итераций можно было увеличить или
уменьшилось в будущем.
Если вас беспокоит вычислительная нагрузка, но вы все еще хотите использовать ключ
растягивание в веб-приложении, рассмотрите возможность запуска растягивания клавиш
алгоритм в браузере пользователя с помощью JavaScript.Стэнфордская криптовалюта JavaScript
Библиотека включает PBKDF2. Количество итераций должно быть достаточно низким.
что систему можно использовать с более медленными клиентами, такими как мобильные устройства, и
система должна вернуться к вычислениям на стороне сервера, если браузер пользователя
не поддерживает JavaScript. Растяжение клавиши на стороне клиента не устраняет
необходимость хеширования на стороне сервера. Вы должны хешировать хеш, созданный клиентом
так же, как и обычный пароль.
Хэши, которые невозможно взломать: хэши с ключами и оборудование для хеширования паролей
Пока злоумышленник может использовать хэш, чтобы проверить, является ли угаданный пароль
правильно или неправильно, они могут провести атаку по словарю или перебором хэша.Следующим шагом будет добавление секретного ключа в хеш, чтобы только кто-то
кто знает ключ, может использовать хеш для проверки пароля. Это может быть
осуществляется двумя способами. Либо хэш может быть зашифрован с помощью такого шифра, как
AES, или секретный ключ может быть включен в хеш с помощью хеш-кода с ключом
алгоритм как HMAC.
Это не так просто, как кажется. Ключ должен храниться в секрете от
злоумышленник даже в случае взлома. Если злоумышленник получает полный доступ к
системы, они смогут украсть ключ независимо от того, где он хранится.Ключ должен храниться во внешней системе, например, в физически отдельном
сервер, предназначенный для проверки пароля, или специальное аппаратное устройство
к серверу прикреплен такой как YubiHSM.
Я настоятельно рекомендую этот подход для любого крупного масштаба (более 100 000
пользователей) сервис. Считаю необходимым для любой услуги хостинга более чем
1000000 учетных записей пользователей.
Если вы не можете позволить себе несколько выделенных серверов или специального оборудования,
вы по-прежнему можете пользоваться некоторыми преимуществами хэшей с ключом в стандартной сети
сервер.Большинство баз данных взломаны с помощью атак с использованием SQL-инъекций,
которые в большинстве случаев не дают злоумышленникам доступа к локальной файловой системе
(отключите доступ к локальной файловой системе на вашем сервере SQL, если он имеет эту функцию).
Если вы сгенерируете случайный ключ и сохраните его в недоступном файле
из Интернета и включить его в соленые хэши, тогда хеши не будут
быть уязвимым, если ваша база данных будет взломана с помощью простой SQL-инъекции
атака. Не вставляйте ключ в исходный код жестко, генерируйте его случайным образом
когда приложение установлено.Это не так безопасно, как использование отдельного
система для хеширования паролей, потому что если есть SQL-инъекция
уязвимости в веб-приложении, возможно, существуют и другие типы, например
как включение локального файла, которое злоумышленник может использовать для чтения секретного ключа
файл. Но это лучше, чем ничего.
Обратите внимание, что ключевые хэши не устраняют необходимости в соли. Умная
злоумышленники в конечном итоге найдут способы взломать ключи, поэтому
Важно, чтобы хэши по-прежнему были защищены солью и растяжкой ключей.
Прочие меры безопасности
Хеширование паролей защищает пароли в случае нарушения безопасности. Оно делает
не сделать приложение в целом более безопасным. Необходимо сделать гораздо больше, чтобы
предотвратить кражу хэшей паролей (и других данных пользователя) при первом
место.
Даже опытные разработчики должны иметь образование в области безопасности, чтобы писать безопасные приложения.
Отличный ресурс для изучения уязвимостей веб-приложений —
Открытое веб-приложение
Проект безопасности (OWASP).Хорошее введение — это
Список десяти самых уязвимых мест OWASP.
Если вы не разобрались со всеми уязвимостями в списке, не пытайтесь
написать веб-приложение, которое работает с конфиденциальными данными. Это работодатель
ответственность за обеспечение надлежащего обучения всех разработчиков безопасным
разработка приложения.
Хорошая идея — провести сторонний «тест на проникновение» для вашего приложения. Даже
лучшие программисты делают ошибки, поэтому всегда имеет смысл иметь безопасность
экспертная проверка кода на наличие потенциальных уязвимостей.Найдите надежного
организации (или нанять сотрудников) для регулярной проверки вашего кода. В
процесс проверки безопасности должен начинаться на ранних этапах работы приложения и продолжаться
на протяжении всего своего развития.
Также важно контролировать свой веб-сайт, чтобы обнаружить нарушение, если оно
происходят. Я рекомендую нанять хотя бы одного человека, который на полную ставку выявляет
и реагирование на нарушения безопасности. Если нарушение остается незамеченным, злоумышленник
может заставить ваш сайт заражать посетителей вредоносными программами, поэтому это очень важно
что нарушения обнаруживаются и незамедлительно принимаются меры.
Часто задаваемые вопросы
Какой алгоритм хеширования мне следует использовать?
DO использование:
НЕ используйте :
- Быстрые криптографические хеш-функции, такие как MD5, SHA1, SHA256, SHA512, RipeMD, WHIRLPOOL, SHA3 и т. Д.
- Небезопасные версии крипты (1 доллар, 2 доллара, 2 доллара, 3 доллара).
- Любой алгоритм, который вы разработали самостоятельно. Используйте только те технологии, которые являются общественным достоянием и были хорошо протестированы опытными криптографами.
Несмотря на то, что нет никаких криптографических атак на MD5 или SHA1, которые делают
их хэши легче взломать, они старые и широко считаются
(несколько неправильно), чтобы не подходить для хранения паролей. Так что я не
рекомендую их использовать. Исключением из этого правила является PBKDF2, который
часто реализуется с использованием SHA1 в качестве базовой хеш-функции.
Как разрешить пользователям сбрасывать пароль, если они его забыли?
Лично я считаю, что все механизмы сброса паролей широко распространены.
использование сегодня небезопасно.Если у вас высокие требования к безопасности, например
служба шифрования не позволит пользователю сбрасывать пароль.
Большинство веб-сайтов используют цикл электронной почты для аутентификации пользователей, которые забыли свои
пароль. Для этого сгенерируйте случайный одноразовый токен , который строго
привязан к аккаунту. Включите его в ссылку для сброса пароля, отправленную пользователю
адрес электронной почты. Когда пользователь щелкает ссылку для сброса пароля, содержащую действительный
токен, запросите у них новый пароль. Убедитесь, что токен сильно привязан
в учетную запись пользователя, чтобы злоумышленник не мог использовать токен, отправленный на его собственный адрес электронной почты
адрес для сброса пароля другого пользователя.
Срок действия токена должен истечь через 15 минут или после его использования, в зависимости от того, что
на первом месте. Также рекомендуется истечь все существующие токены паролей, когда
пользователь входит в систему (они вспомнили свой пароль) или запрашивает повторный сброс
токен. Если срок действия токена не истекает, его можно навсегда использовать для взлома
аккаунт пользователя. Электронная почта (SMTP) — это простой текстовый протокол, и может быть
вредоносные маршрутизаторы в Интернете, записывающие почтовый трафик. И электронная почта пользователя
учетная запись (включая ссылку для сброса) может быть взломана спустя долгое время после ввода пароля
был изменен.Если срок действия токена истекает как можно скорее,
подверженность пользователя этим атакам.
Злоумышленники смогут изменять токены, поэтому не храните учетную запись пользователя.
информация или информация о тайм-ауте в них. Они должны быть непредсказуемыми
случайный двоичный большой двоичный объект, используемый только для идентификации записи в таблице базы данных.
Никогда не отправляйте пользователю новый пароль по электронной почте. Не забудьте выбрать новый случайный
соль, когда пользователь сбрасывает свой пароль. Не используйте повторно ту, которая использовалась для
хэшировать свой старый пароль.
Что мне делать, если произошла утечка / взлом базы данных моей учетной записи?
Ваша первая задача — определить, как была взломана система, и исправить
уязвимость, которую использовал злоумышленник. Если у вас нет опыта
реагируя на нарушения, я настоятельно рекомендую нанять стороннюю охранную фирму.
Может возникнуть соблазн прикрыть брешь и надеяться, что никто не заметит. Однако попытка скрыть брешь делает вас хуже, потому что вы ставите
ваши пользователи подвергаются дополнительному риску, не сообщая им, что их пароли и другие
личная информация может быть
скомпрометирован.Вы должны сообщить своим пользователям как можно скорее, даже если вы еще не полностью понимаете, что произошло. Поместите уведомление на
первая страница вашего сайта, которая ссылается на страницу с более подробной информацией,
и, если возможно, отправьте уведомление каждому пользователю по электронной почте.
Объясните своим пользователям, как именно были защищены их пароли — надеюсь
с солью — и что, хотя они были защищены соленым
хеша, злонамеренный хакер может по-прежнему проводить атаки по словарю и методом перебора
хеши.Вредоносные хакеры будут использовать любые найденные пароли, чтобы попытаться войти в
аккаунт пользователя на другом веб-сайте, надеясь, что они использовали тот же пароль на
оба сайта. Сообщите своим пользователям об этом риске и порекомендуйте им изменить
их пароль на любом веб-сайте или в сервисе, где они использовали аналогичный пароль.
Заставьте их сменить пароль для вашей службы при следующем входе в систему.
Большинство пользователей попытаются «сменить» свой пароль на исходный, чтобы получить
вокруг принудительно меняют быстро. Используйте текущий хэш пароля, чтобы убедиться, что
они не могут этого сделать.
Вполне вероятно, что даже с солеными медленными хешами злоумышленник сможет
очень быстро взломать некоторые из слабых паролей. Чтобы уменьшить окно возможности злоумышленника использовать эти пароли, вы должны потребовать в
в дополнение к текущему паролю, цикл электронной почты для аутентификации до тех пор, пока
пользователь изменил свой пароль. См. Предыдущий вопрос «Как разрешить
пользователям сбрасывать свой пароль, если они его забыли? «, чтобы узнать, как реализовать
проверка подлинности цикла электронной почты.
Также сообщите своим пользователям, какая личная информация хранилась на
интернет сайт.Если ваша база данных включает номера кредитных карт, вам следует проинструктировать
пользователям внимательно просматривать свои недавние и будущие счета и отменять
кредитная карта.
Какой должна быть моя политика паролей? Следует ли мне применять надежные пароли?
Если ваш сервис не имеет строгих требований к безопасности, не ограничивайте
пользователей. Я рекомендую показывать пользователям информацию о силе их
пароль по мере его ввода, позволяя им решать, насколько безопасны они
пароль быть.Если у вас есть особые потребности в безопасности, установите минимальную длину
12 символов и требует как минимум двух букв, двух цифр и двух символов.
Не заставляйте пользователей менять пароль чаще, чем раз в шесть.
месяцев, так как это «утомляет пользователя» и снижает вероятность выбора
хорошие пароли. Вместо этого научите пользователей менять свои пароли, когда они
он был взломан, и никогда никому не сообщать свой пароль. Если это
деловая обстановка, поощряйте сотрудников использовать оплачиваемое время для запоминания и практики
их пароль.
Если злоумышленник имеет доступ к моей базе данных, не могут ли они просто заменить хеш моего пароля своим собственным хешем и логином?
Да, но если у кого-то есть доступ к вашей базе данных, вероятно, у них уже есть
доступ ко всему на вашем сервере, поэтому им не нужно будет входить в ваш
аккаунт, чтобы получить то, что они хотят. Цель хеширования паролей (в контексте
веб-сайта) не для защиты веб-сайта от взлома, а для защиты
пароли в случае взлома.
Вы можете предотвратить замену хэшей во время атаки SQL-инъекции,
подключение к базе данных с двумя пользователями с разными разрешениями. Один для
код для создания учетной записи и код для входа в систему. «Создать учетную запись»
код должен иметь возможность читать и писать в пользовательскую таблицу, но код входа в систему
должен уметь только читать.
Почему я должен использовать специальный алгоритм, такой как HMAC? Почему я не могу просто добавить
пароль к секретному ключу?
Хеш-функции, такие как MD5, SHA1 и SHA2, используют
Конструкция Меркла-Дамгарда, которая делает их уязвимыми для известных
как атаки удлинения длины.Это означает, что при наличии хэша H (X) злоумышленник может
найти значение H (pad (X) + Y) для любой другой строки Y, не зная X.
pad (X) — это функция заполнения, используемая хешем.
Это означает, что по хэшу H (ключ + сообщение) злоумышленник может вычислить H (pad (ключ +
сообщение) + расширение), не зная ключа. Если хеш использовался как
код аутентификации сообщения с использованием ключа для предотвращения взлома
может изменить сообщение и заменить его другим действительным хешем,
система вышла из строя, поскольку у злоумышленника теперь есть действующий хэш сообщения +
расширение.
Непонятно, как злоумышленник мог использовать эту атаку для взлома хэша пароля.
быстрее. Однако из-за нападения считается плохой практикой
используйте простую хеш-функцию для хеширования с ключом. Умный криптограф может однажды
придумайте умный способ использовать эти атаки, чтобы ускорить взлом, поэтому используйте
HMAC.
Должна ли соль стоять до или после пароля?
Это не имеет значения, но выберите один и придерживайтесь его для обеспечения совместимости.
Кажется, что соль появляется перед паролем.
Почему хеш-код на этой странице сравнивает хеш-коды в
«длина-константа»
время?
Сравнение хэшей за «постоянную длину» времени гарантирует, что
злоумышленник не может извлечь хэш пароля в онлайн-системе, используя
синхронизация атаки, а затем взломать ее в автономном режиме.
Стандартный способ проверить, совпадают ли две последовательности байтов (строк), — это
сравните первый байт, затем второй, затем третий и так далее. Как только
вы найдете байт, который не является одинаковым для обеих строк, вы знаете, что они
разные и могут сразу же дать отрицательный ответ.Если вы пройдете через
обе строки, не обнаружив никаких различающихся байтов, вы знаете, что строки являются
то же самое и может вернуть положительный результат. Это означает, что сравнение двух строк может
займет разное количество времени в зависимости от того, сколько строк совпадают.
Например, стандартное сравнение строк «xyzabc» и
«abcxyz» сразу увидит, что первый символ отличается
и не стал бы проверять остальную часть строки. С другой стороны, когда
строки «aaaaaaaaaaB» и «aaaaaaaaaaZ» сравниваются,
алгоритм сравнения просматривает блок «а», прежде чем он определит
струны неравные.
Предположим, злоумышленник хочет проникнуть в онлайн-систему, которая ограничивает скорость
попытки аутентификации до одной попытки в секунду. Также предположим, что злоумышленник
знает все параметры хэша пароля (соль, тип хэша и т. д.), кроме
для хеша и (очевидно) пароля. Если злоумышленник может получить точное
измерение того, сколько времени требуется онлайн-системе, чтобы сравнить хэш
настоящий пароль с хешем пароля, предоставленного злоумышленником, он может использовать
временная атака для извлечения части хэша и взлома с помощью офлайн-атаки,
в обход ограничения скорости системы.
Сначала злоумышленник находит 256 строк, хэши которых начинаются со всех возможных
байт. Он отправляет каждую строку в онлайн-систему, записывая количество времени
система должна ответить. Строка, которая занимает больше всего времени, будет
тот, чей первый байт хеша совпадает с первым байтом реального хеша. Нападающий сейчас
знает первый байт и может аналогичным образом продолжить атаку на
второй байт, затем третий и так далее. Как только злоумышленник знает достаточно о
хэш, он может использовать свое собственное оборудование, чтобы взломать его, не ограничивая скорость
система.
Может показаться, что провести временную атаку по сети невозможно.
Однако это было сделано и было
доказано, что это практично.
Вот почему код на этой странице сравнивает строки таким же образом
количество времени независимо от того, сколько строк совпадают.
Как работает код SlowEquals?
Предыдущий вопрос объясняет, почему необходим SlowEquals, этот объясняет
как на самом деле работает код.
1. частное статическое логическое значение slowEquals (byte [] a, byte [] b)
2.»оператор для сравнения целых чисел на равенство вместо
оператор «==». Причина объясняется ниже. Результат XORing
два целых числа будут равны нулю тогда и только тогда, когда они точно такие же. Это
потому что 0 XOR 0 = 0, 1 XOR 1 = 0, 0 XOR 1 = 1, 1 XOR 0 = 1. Если мы применим это к
все биты в обоих целых числах, результат будет нулевым, только если все биты
совпадает.
Итак, в первой строке, если длина
равна
b.length
, переменная diff получит нулевое значение, но если нет, она
получит какое-то ненулевое значение.Затем мы сравниваем байты с помощью XOR и OR
результат в diff. Это установит diff в ненулевое значение, если байты различаются.
Поскольку операция ИЛИ никогда не сбрасывает биты, единственный способ diff будет равен нулю в конце
цикл — если он был равен нулю до начала цикла (a.length == b.length) и все
байтов в двух массивах совпадают (ни один из XOR не привел к ненулевому
ценность).
Причина, по которой нам нужно использовать XOR вместо оператора «==» для сравнения целых чисел
состоит в том, что «==» обычно переводится / компилируется / интерпретируется как ветка.b «должен компилироваться во что-то вроде
следующие, время выполнения которых не зависит от равенства
целые числа:
MOV EAX, [A]
XOR EAX, [B]
OR [DIFF], EAX
Зачем заморачиваться с хешированием?
Ваши пользователи вводят свой пароль на ваш сайт. Они тебе доверяют
с их безопасностью. Если ваша база данных взломана, а пароли ваших пользователей
незащищенные, то злонамеренные хакеры могут использовать эти пароли для взлома вашего
учетные записи пользователей на других сайтах и сервисах (большинство людей используют те же
пароль везде).Под угрозой находится не только ваша безопасность, это ваша
пользователей. Вы несете ответственность за безопасность своих пользователей.
.
Объяснение хэша — Функции хеширования — BitcoinWiki
Это утвержденная версия этой страницы, а также самая последняя.
Понравилась статья? Поделиться:
Хэш или также называемая хеш-функцией . — это любой алгоритм , который отображает данные произвольной длины на данные фиксированной длины. Значения, возвращаемые хеш-функцией, называются хеш-значениями, хеш-кодами, хеш-суммами, контрольными суммами или просто хешами. Недавнее развитие сетей интернет-платежей и цифровых денег, таких как Биткойн, также использует форму «хеширования» для контрольных сумм и привлекло дополнительное внимание к этому термину.
Обзор хеш-функции [править]
Криптографическая хеш-функция — Хынская академия
Хеш-функции в основном используются для генерации выходных данных фиксированной длины, которые действуют как сокращенная ссылка на исходные данные. Это полезно, когда исходные данные слишком громоздки для использования целиком.
Одно из практических применений — это структура данных, называемая хеш-таблицей, в которой данные хранятся ассоциативно. Линейный поиск имени человека в списке становится громоздким по мере увеличения длины списка, но хешированное значение можно использовать для хранения ссылки на исходные данные и получения постоянного времени (исключение конфликтов).Другое применение — в криптографии, науке о кодировании и защите данных. Легко сгенерировать хеш-значения из входных данных и легко проверить, что данные соответствуют хешу, но сложно «подделать» хеш-значение, чтобы скрыть вредоносные данные. Это принцип, лежащий в основе алгоритма PGP для проверки данных.
Чтобы хеш-функция считалась эффективной, она должна иметь следующие свойства:
- Вычислительная эффективность — вычисление хэша из заданного ввода не займет много времени.
- Устойчивость к коллизиям — должно быть трудно найти отдельные входные данные, которые привели бы к одному и тому же хешу после применения хеш-функции.
- Способность скрывать информацию — должно быть сложно извлечь что-либо полезное о вводе из хэша, будь то входные данные целиком или такая простая информация о них, как нечетное или четное число.
- Случайно выглядящий хеш — хеш должен выглядеть так, как будто он был результатом нескольких случайных событий, например, подбрасывания монеты.Не должно быть явного конкретного протокола преобразования.
Функция биткойн-хеширования [править]
Биткойн использует алгоритм хеширования SHA-256 для генерации проверяемых «случайных» чисел способом, который требует предсказуемой нагрузки на процессор. Создание хэша SHA-256 со значением меньше, чем текущая цель, решает блок и приносит вам несколько монет.
Скорость хеширования [править]
Результаты тестов MD5, SHA-1, SHA-256 и SHA-512 основаны на двух случаях с короткой строкой (36 и 49 символов) и более длинной строкой (72 и 85 символов).
- SHA-256 быстрее на 31%, чем SHA-512, только при хешировании небольших строк. Когда строка длиннее, SHA-512 быстрее на 2,9%.
- Время получения метки системного времени составляет ~ 121,6 мс на 1 млн итераций.
- Время генерации UUID составляет ~ 670,4 мс на 1M итераций.
- SHA-1 — самая быстрая функция хеширования с ~ 587,9 мс на 1M операций для коротких строк и 881,7 мс на 1M для более длинных строк.
- MD5 на 7,6% медленнее, чем SHA-1 для коротких строк и 1.3% для более длинных струн.
- SHA-256 на 15,5% медленнее, чем SHA-1 для коротких строк и на 23,4% для более длинных строк.
- SHA-512 на 51,7% медленнее, чем SHA-1 для коротких строк и на 20% для более длинных.
Что такое хеш-биткойн [править]
В протоколе биткойнов хеш-функции являются частью алгоритма хеширования блоков, который используется для записи новых транзакций в цепочку блоков в процессе майнинга.
Хеш-функции в майнинге биткойнов, входными данными для функции являются все самые последние, еще не подтвержденные транзакции (вместе с некоторыми дополнительными входными данными, относящимися к метке времени и ссылкой на предыдущий блок).
В приведенном выше примере кода мы уже видели, что изменение небольшой части ввода для хэш-функции приводит к совершенно другому результату. Это свойство имеет решающее значение для алгоритма доказательства работы, задействованного в майнинге: чтобы успешно «решить» блок, майнеры пытаются объединить все входные данные со своими собственными произвольными входными данными таким образом, чтобы полученный хеш начинался с определенное количество нулей.
В качестве примера хеш-функции мы могли бы попробовать «добычу» с помощью нашей хеш-функции Python, вручную добавив восклицательные знаки после «CoinDesk Rock!» пока мы не найдем хеш, который начинается с одного нуля.
Пример хэша: >>> hash ("CoinDesk качается !!") 66925f1da83c54354da73d81e013974d >>> hash ("CoinDesk качается !!!") c8de96b4cf781a6373766c668ceac0f0 >>> hash ("CoinDesk качается !!!!") 9ea367cea6a2cc4a6f5a1d9a334d0d9e >>> hash ("CoinDesk качается !!!!!") b8d43387d98f035e2f0ac49740a5af38 >>> hash ("CoinDesk качается !!!!!!") 0fe46518541f4739613b9ce29ecea6b6 => РЕШЕНО!
Решение хеш-функций в блоке биткойнов, которое на момент написания должно начинаться с 18 нулей, требует чрезвычайно большого объема вычислений (и поэтому объединенная вычислительная мощность всех компьютеров в сети по-прежнему занимает примерно 10 минут, чтобы решить блок).
Необходимость в такой большой вычислительной мощности означает, что новые биткойны добываются в течение длительного периода времени, а не все сразу.
Чтобы заработать биткойны с помощью майнинга, вам нужно приложить огромный объем работы, необходимой для решения блока, и, получая это вознаграждение, вы блокируете все новые транзакции в блоке, который добавляется к постоянная запись всех предыдущих транзакций: блокчейн.
Тест функций полного хеширования
Хеш транзакции биткойнов в кошельке [править]
Хеш транзакции (txid) — это идентификатор, используемый для однозначной идентификации конкретной транзакции.Все транзакции в цепочке (транзакции с внешних адресов или на них) имеют уникальный txid, который можно увидеть в деталях транзакции. Хеш транзакции обычно выглядит как случайный набор букв и цифр. Все транзакции в сети (ввод и вывод средств) имеют уникальный txid, который можно найти в деталях транзакции.
В приложениях Freewallet:
Нажмите на транзакцию> Искать хэш в списке> Проверить транзакцию в цепочке блоков.
Внешние ссылки [править]
- Страница хеш-функции в Википедии.орг
См. Также на BitcoinWiki [править]
.
hashlib — безопасные хэши и дайджесты сообщений — документация Python 3.8.6
Этот модуль реализует общий интерфейс для множества различных безопасных хешей и
алгоритмы дайджеста сообщений. Включены алгоритмы безопасного хеширования FIPS SHA1,
SHA224, SHA256, SHA384 и SHA512 (определенные в FIPS 180-2), а также MD5 RSA
алгоритм (определен в Интернете RFC 1321 ). Термины «безопасный хеш» и
«Дайджест сообщения» взаимозаменяемы. Старые алгоритмы назывались сообщением
переваривает. Современный термин — безопасный хеш.
Хеш-алгоритмы
Существует один метод конструктора, названный для каждого типа хэша . Все возвращаются
хэш-объект с таким же простым интерфейсом. Например: используйте sha256 ()
для
создать хэш-объект SHA-256. Теперь вы можете кормить этот объект байтовыми
объекты (обычно байтов
) с использованием метода update ()
.
В любой момент вы можете попросить у него дайджест
конкатенация данных, переданных ему до сих пор, с использованием дайджеста ()
или
hexdigest ()
методы.
Примечание
Для повышения производительности многопоточности выпущен Python GIL для
данные размером более 2047 байт при создании или обновлении объекта.
Примечание
Подача строковых объектов в update ()
не поддерживается, так как хеши работают
по байтам, а не по символам.
Конструкторы для хеш-алгоритмов, которые всегда присутствуют в этом модуле:
sha1 ()
, sha224 ()
, sha256 ()
, sha384 ()
,
sha512 ()
, blake2b ()
и blake2s ()
. md5 ()
также обычно доступен, хотя
может отсутствовать, если вы используете редкую «FIPS-совместимую» сборку Python.
Дополнительные алгоритмы также могут быть доступны в зависимости от OpenSSL.
библиотека, которую Python использует на вашей платформе. На большинстве платформ
sha3_224 ()
, sha3_256 ()
, sha3_384 ()
, sha3_512 ()
,
Также доступны shake_128 ()
, shake_256 ()
.
Новое в версии 3.6: конструкторы SHA3 (Keccak) и SHAKE sha3_224 ()
, sha3_256 ()
,
sha3_384 ()
, sha3_512 ()
, shake_128 ()
, shake_256 ()
.
Например, чтобы получить дайджест байтовой строки b'Никто не проверяет
:
повторение спама '
>>> import hashlib >>> m = hashlib.sha256 () >>> m.update (б "Никто не проверяет") >>> m.update (b "повторение спама") >>> m.digest () b '\ x03 \ x1e \ xdd} Ae \ x15 \ x93 \ xc5 \ xfe \\\ x00o \ xa5u + 7 \ xfd \ xdf \ xf7 \ xbcN \ x84: \ xa6 \ xaf \ x0c \ x95 \ x0fK \ x94 \ x06 ' >>> m.digest_size 32 >>> m.block_size 64
Более сжатое:
>>> hashlib.sha224 (b "Никто не проверяет повторение спама"). hexdigest () 'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
-
hashlib.
новый
( наименование [, данные ]) Универсальный конструктор, который принимает строку name желаемого
алгоритм в качестве первого параметра. Он также существует, чтобы разрешить доступ к
перечисленные выше хэши, а также любые другие алгоритмы, которые ваш OpenSSL
библиотека может предложить. Названные конструкторы намного быстрее, чем
.