Если ваш ввод представляет собой 20-значное число, то существует 10 20 возможных вводов.
Если ваш вывод представляет собой 12-символьную буквенно-цифровую строку, то существует 62 12 возможных выходных данных.
Входы:
100000000000000000000
Выходы:
3226266762397899821056
Если мы посмотрим внимательнее, то увидим, что нижний номер длиннее.
Это означает, что есть больше возможных выходов, чем входов.
Это означает, что хеширование не имеет смысла, поскольку каждый возможный выход может быть сопоставлен непосредственно с одним входом. Так что это означает, что было бы невероятно легко взломать и вернуть действительные цифры.
Итак, мы просто будем использовать более короткий хэш!
В чем смысл? Просто используйте целое, случайное, если нужно.
Давайте возьмем пароли в качестве примера.
Вы никогда не храните пароль. Вы храните только хэш. Это облегчает проверку заданного ввода по этому хешу (чтобы увидеть, является ли предоставленный пароль правильным) без сохранения действительного пароля.
Это работает, потому что:
- наши алгоритмы хеширования не дают одинакового хеша для двух входных данных легко (конфликты маловероятны)
- неразумно предполагать, что кто-то может выяснить исходные данные для данного хэша
И почему так? Ну, пароль, который я использовал, мог быть длиной 1000000 символов. Как ты собираешься понять это из короткого хэша? Ты не можешь Вы можете только попытаться подсчитать как можно больше хэшей, сравнить их с тем, который у вас есть, и надеяться на совпадение. В этом случае обычно даже не актуально находить фактический исходный ввод, так как любой ввод, который выдает тот же хеш, будет работать.
Итак, если я атакующий и получил базу данных с помощью хэшей, я мог бы сравнить хэши с набором, который я ранее вычислил, чтобы найти действительный вход для этого хэша. Этому обычно противостоит соление ваших хэшей.
Таким образом, злоумышленник будет вынужден использовать грубую силу до тех пор, пока он не найдет действительный ввод для соответствующего хэша (который будет длиться вечно, потому что существует безумное количество возможных хэшей).
Но что, если пароли были ограничены определенной длиной, и они могли содержать только цифры?
Это резко уменьшает возможные входные данные и, следовательно, время, которое потребуется для перебора подходящего хэша.
И это в основном то, что вы делаете при хешировании номеров кредитных карт. Но это еще хуже, потому что если злоумышленник получил совпадение, то это будет не просто произвольная строка, а, скорее всего, действительный номер кредитной карты!