Что такое хеш-функции?
Сегодня поговорим о хеш-функциях.
Для начала, что это такое – некриптографическая хеш-функция.
Хеш-функция берет информацию произвольного или какого-либо фиксированного размера в качестве параметра и на выходе всегда выдает результат фиксированного или определенного размера.
Пример хеш-функций – штрих-код на бутылке. Последняя цифра называется контрольной. Она берется из суммы всех предыдущих цифр, и если у нас получается сумма больше, чем одна цифра, соответственно, мы еще раз складываем. На входе у нас несколько цифр, на выходе всегда одна. Это вот такая примитивная хеш-функция.
Вторым примером можно считать CRC32. На входе у нас файл, он может быть размером гигабайт, терабайт, неважно. На выходе у нас всегда контрольная сумма длиной ровно 32 бита.
Теперь о криптографических хеш-функциях. В Bitcoin используется SHA-256, в Litecoin — Scrypt, в Ethereum – это Ethash, который тоже основан на SHA.
Свойства криптографических хеш-функций:
- Стойкость к так называемым коллизиям. Это когда два разных параметра дают один и тот же результат. То есть нельзя найти x и y, что x и y между собой не равны, но при этом H(x) = H(y). Нельзя найти никак, то есть придумать какой-то математический алгоритм. Единственным самым оптимальным решением этой задачи был бы просто перебор, брутфорс, но вот именно для этого хеш-функции выдают такой довольно длинный результат. И, соответственно, чтобы нам, например, в случае с SHA-256 с вероятностью, близкой к 100 %, найти эту коллизию, нам нужно провести где-то 2 в 130-й степени количество переборов. Для этого не хватит даже всех существующих компьютеров в мире в течение всего времени существования Вселенной, чтобы эту коллизию найти.
- Необратимость. Это когда мы из результата H(x) не можем узнать само x. В качестве примера здесь можно привести использование пароля в базах данных. Любой, кто пользуется, например, электронной почтой, чем угодно, когда мы входим в этот сервис, мы должны представить пароль, в базе данных хранится всегда не пароль, а хеш этого пароля. Зачем это делается? Если, допустим, кто-то взломал эту базу данных, он увидит список пользователей и список хешей паролей, а не сами пароли. Таким образом, в принципе он ваш пароль не узнает и с ним залогиниться тоже не сможет, потому что мы все-таки сравниваем пароль, а не хеш.
Единственной проблемой является то, что, если мы заранее знаем какие-то параметры и у нас их ограниченное количество, например, мы хотим каким-то образом зашифровать результат подброса монетки, орел или решка, мы можем заранее посчитать все варианты, то есть, например, хеш от орла и хеш от решки, и уже мы, зная результат хеш-функции, мы всегда сможем вычислить назад число. Как эта проблема разрешается? Используется так называемая соль. Это случайное число, которое добавляется к параметру или к сообщению. Вот таким образом, криптографическая хеш-функция еще имеет свойство так называемого вскрытия, когда мы вот к этому, орел или решка, казалось бы, у нас ограничено количество вариантов, прибавляем это случайное число соль, мы все равно не сможем назад узнать x. Но предоставляя хеш и это случайное число, мы всегда можем доказать, что изначальным сообщением было x.
Кстати, вы можете обсудить новость в нашем Telegram чате.
______________________________________________
Подписывайся, чтобы не упустить ничего важного.
Telegram канал | YouTube канал | Facebook страница | Twitter | VK