Для ответа на реальный вопрос перейдите к последнему разделу этого ответа. Другие разделы не отвечают на ваш вопрос напрямую, но вы можете обнаружить, что это больше не нужно после их прочтения.
Ваше описание системы
Вы сказали, что система обрабатывает пароль следующим образом
plaintext password
➜ hashed password
➜ first 10 characters of the hash
Пример:
Topsecret123
➜ *E7C95D33E14D3C2A3AE4EAB25C1D98C88593F7AC
➜ *E7C95D33E
Обратите внимание, что префиксы PASSWORD()
MySQL хешируются с *
, так что вы фактически включаете только 9 символов из хеша.
Ответ на вопрос в фоновом режиме
Вы спрашивали, как найти коллизии хеша для подхода сверху, используя hashcat, но то, что вы на самом деле хотели узнать / показать, было
доказать, что хеширование пароля может сделать [...] другой пароль принятым приложением.
Ваш акцент был сделан на » Тримминг вызывает принятие нескольких паролей«. Однако вы упустили из виду, что даже хеширование без ограничений приводит к принятию нескольких паролей.
Принцип голубиных отверстий
Объяснение настолько простое, что вам не нужно находить хеш-столкновение. Каждый должен понимать следующее:
- Существует бесконечное количество паролей.
- Хеши паролей MySQL имеют фиксированную длину, ровно 64 бита. Может быть только 2 64 разных хешей.
- Функция хэширования паролей отображает пароли на хэши. Поскольку паролей больше, чем хэшей, некоторые пароли должны быть сопоставлены с одним и тем же хешем.
Если нет, вы бы нашли функцию сжатия, которая позволяла бы хранить что угодно только в 64 битах.
Можно утверждать, что количество действительных паролей не бесконечно. Но даже если бы вы допустили, чтобы действительные пароли были точно длиной 11 и содержали только символы из группы [A-Za-z0-9]
(имеет 62 символа), было бы 62 11 уникальных паролей:
62 11 ≈ 5,2 × 10 19 пароли
2 64 ≈ 1,8 × 10 19 хэши
Следовательно, все еще должно быть много столкновений.
Hash Collisions
Обрезка хэшей не является основной причиной проблемы коллизий, но, конечно, она чрезвычайно увеличивает вероятность коллизий. Обычно коллизии хешей не являются проблемой, потому что они случаются так редко, что вы не сталкиваетесь с ними. Однако с такими сильно урезанными хэшами, как ваша, коллизии становятся настоящей проблемой.
В поисках столкновения
Использование Hashcat
hashcat может вычислять хэши паролей MySQL с -m 300
. Вы можете подтвердить это путем вычисления SELECT Password("hashcat");
и сравнения полученного хеша с показанным здесь хешем .
Однако я не мог найти способ обрезать эти хэши / искать префиксные коллизии. Я думаю, hashcat не может делать то, что вы хотите . Вы должны будете реализовать пользовательский хеш-режим для hashcat. Самый простой способ сделать это - изменить текущую реализацию режима MySQL в hashcat . Я не уверен, но может быть достаточно просто изменить const int out_len = 40;
на 9
. Возможно, вам придется обновить версии OpenCL того же модуля. Искать m00300
здесь .
Использование собственного сценария
В качестве альтернативы, найдите список паролей-хеш-пар или сгенерируйте их самостоятельно, затем найдите коллизии префиксов в этой таблице. Это было весело, поэтому я сделал это сам
Следующая программа на Python генерирует усеченные хэши для некоторых числовых паролей:
#! /usr/bin/python3
import hashlib as hl
def mySqlPwHash(password):
return hl.sha1(hl.sha1(password.encode()).digest()).hexdigest()[:9]
for number in range(0, 300000):
password = str(number)
print(password, "\t", mySqlPwHash(password))
Я решил сгенерировать 300'000 хэшей, потому что есть 16 9 усеченных хэшей, и мы можем ожидать столкновения в √ (16 9 ) = 262'144 попытки ( см. день рождения проблема ).
Чтобы найти пароли с таким же хешем, запустите скрипт следующим образом:
./collide.py | sort -k2 | uniq -Df1
Только в двухсекунд сценарий закончен и напечатан
23607 47ae310ff
251848 47ae310ff
И вот он у вас, два пароля (23607
и 251848
) с одинаковым урезанным хешем (47ae310ff
).
Если ваши урезанные хэши на самом деле содержат 10 шестнадцатеричных цифр, вы можете адаптировать скрипт и найти два пароля 1874547
и 2873667
, разделяющих хэш 47fc464b2f
.