Хеши на этой странице настоящие — считаются прямо в вашем браузере через
встроенный Web Crypto API, без единой внешней библиотеки. Подбор пароля и
поиск коллизии — тоже настоящие вычисления, а не анимация ради красоты.
Что такое хеш
Настоящий SHA-256
Хеш-функция превращает любой текст — хоть букву, хоть целую книгу — в
строку фиксированной длины. Один и тот же текст всегда даёт один и тот же
хеш, но восстановить текст обратно по хешу нельзя — функция односторонняя.
Введите что угодно:
Лавинный эффект
Настоящий SHA-256
Измените всего один символ — и хеш меняется полностью, а не «немного».
Это специально так устроено: иначе по похожести хешей можно было бы
догадываться о похожести исходных текстов.
Коллизии
Настоящий поиск
Коллизия — когда два разных входа дают один и тот же хеш. У SHA-256
(256 бит) реальную коллизию искать дольше, чем существует Вселенная —
именно это и делает его надёжным. Чтобы показать коллизию по-настоящему,
а не на словах, ниже — специально слабый игрушечный хеш всего на 16 бит
(65536 возможных значений). Браузер реально перебирает случайные строки,
пока не найдёт совпадение:
Подбор PIN-кода
Настоящий подбор
Загадан настоящий случайный 4-значный PIN и его настоящий хеш — ничего
не подстроено заранее. Ниже — честный перебор всех 10000 вариантов, но
показ специально замедлен и стилизован «под кино» для наглядности
(реально в браузере это происходит намного быстрее, чем можно
рассмотреть глазом).
Раз это настолько быстро — почему
банкоматы и телефоны не взламывают за секунды? Потому что там PIN
проверяет не ваш локальный браузер, а сервер — и ограничение частоты
попыток (rate limiting) на его стороне помогает настолько сильно, что
даже трёхзначный CVV-код на банковской карте (всего 1000 вариантов)
остаётся приемлемо надёжным — платёжные системы агрессивно
ограничивают число неудачных попыток на карту. Удлинить PIN до 6 или
8 цифр почти ничего не даёт, если сервер не ограничивает количество
попыток: без throttling даже 8 цифр переберёт скрипт, а с нормальным
throttling и 3-4 цифры создают реальную защиту. Именно отсутствие
такого ограничения на API «Найти iPhone» отчасти позволило массовый
взлом iCloud-аккаунтов в 2014 году (утечку знают как «The
Fappening») — брутфорс шёл не по паролю умом, а по API, который не
останавливал повторные попытки.
Словарь против перебора
Настоящий подбор
Загадан пароль «sunshine22» — из
тех, что реально входят в списки самых частых паролей. Ниже — настоящий
подбор по небольшому словарю таких паролей (плюс частые цифровые
суффиксы), не по всем сочетаниям символов подряд.
Один символ, root-доступ
Реальная история
Лавинный эффект (шаг 2) — не просто красивое свойство. Он значит, что
если у вас есть хеш «правильной», проверенной версии кода, любое
постороннее изменение — хоть один символ — сразу даст совершенно другой
хеш. Не нужно вручную построчно сравнивать тысячи файлов, чтобы заметить
подмену.
В ноябре 2003 года кто-то без авторизации получил доступ к
CVS-зеркалу репозитория ядра Linux и добавил в функцию
wait4() примерно такую строку:
Разница с легитимным кодом — один символ: =
вместо ==. Это не сравнение,
а присваивание — current->uid = 0
выполняется как побочный эффект вычисления условия, то есть любой процесс,
вызвавший wait4() с этими
флагами, тут же становился root — независимо от того, что происходило
дальше в if.
Заметили не потому, что кто-то построчно вычитал весь diff — подозрение
вызвало то, что изменение попало в дерево в обход обычного процесса
проверки патчей. В релиз оно не попало. Именно для таких ситуаций и
нужны хеши: сравнение хеша дерева исходников с доверенной версией
поймало бы это изменение мгновенно, ещё до того, как кто-то стал бы
читать код глазами.
Нужно больше, чем инструмент?
Если это помогло — можем поговорить про остальное
Карьера в IT, разбор проекта, поиск процесса под вашу задачу — 30 минут,
бесплатно и без обязательств.