Если кому-нибудь нужно найти строку, соответствующую известному вам md5-хэшу, попробуйте вот этот сервис:
http://passcracking.com/
Хотя лично я сильно сомневаюсь в его перспективности - ведь таблица всех 128-битных хэшей и соотвествующих им строк будет занимать коллосальный объем, который нетрудно вычислить. Таблица должна содержать минимум два поля:
1) 128-битный хэш md5 - (размер 16 байт)
2) строка, для которой md5(cтрока) = хэш (минимальный размер - 16 байт. Максимальный - не ограничен. Тут можно хранить и коллизии хэша)
Итого для хранения одной строки из таблицы нужно минимум 32 байта. Тогда для всех
2^128 строк потребуется
32 * 2^128 = 2^133 байт или
2^133 / (2^40) = 2^93 = 9903520314283042199192993792 терабайт. Попытайтесь хотя бы представить, сколько потребуется 1000-Гбайтных винчестеров для хранения этой таблицы
Не спорю, этот проект полезен для хэшей, полученных из пользовательских паролей "в лоб", т.е. hash = md5(password), т.к. множество наиболее вероятных паролей, которые обычно выбирает человек, намного меньше множества всех возможных строк password заданной длины.
Но появление таких сервисов, как
http://passcracking.com/ отнюдь не значит, что скоро придется искать замену современным криптографическим хэш-функциям. Нужно всего лишь иметь собственную голову "за плечами". Например, если добавлять к паролю, выбранному пользователем, случайную строку символов, перед тем, как вычислять хэш, вышеупомянутый сервис становится практически бесполезным. Например,
PHP:
<?php
/**
Генерирует псевдослучайную строку длиной $len.
*/
function get_rnd_str($len)
{
$str = '';
while ($len-- > 0) {
$str .= chr(mt_rand() & 0xff);
}
return $str;
}
/**
Возвращает строку, содержащую md5-хэш и случайную строку.
Общая длина возвращаемой строки - 32 байта
*/
function get_modified_md5($str)
{
$salt = get_rnd_str(16);
return pack('H*', md5($str . $salt)) . $salt;
}
/**
Возвращает true, если хэш $hash соответствует строке $str.
Иначе возвращает false
*/
function validate_modified_md5($str, $hash)
{
return !strcmp(substr($hash, 0, 16), pack('H*', md5($str . substr($hash, 16, 16))));
}
/***********************************************/
/* пример использования модифицированного хэша */
/***********************************************/
$str = 'test'; // тестовая строка
print("String is: [${str}]<br>\n");
$hash = get_modified_md5($str); // получаем модифицированный хэш
// пропускаем хэш через base64_encode() перед выводом на печать для удобочитаемости
print('Modified hash is: [' . base64_encode($hash) . "]<br>\n");
// сверяем хэш с верной строкой $str
if (validate_modified_md5($str, $hash)) print("Hash is valid for string [${str}]<br>\n");
else print("Hash is invalid for string [${str}]<br>\n");
// сверяем хэш с неверной строкой $str
$str = 'wrong string';
if (validate_modified_md5($str, $hash)) print("Hash is valid for string [${str}]<br>\n");
else print("Hash is invalid for string [${str}]<br>\n");
?>