md5 - 16 символов

Vadimka

Новичок
md5 - 16 символов

Можно ли захешировать сабж в 16 символов, а не 32 символа?
 

Кром

Новичок
md5() возвращает именно 32 символа. Если она будет возвращать 16, то это будет уже не md5()

-~{}~ 26.06.04 18:45:

И главное, что 32 символа большинство устраивает.
 

Kelkos

Сам себе программер
Ну отрежь первую (или вторую) половину от строки md5 и будет тебе 16 символов. А чем 32 не устраивает то?
 

IL78

Guest
В мануале написано, что hash - это 16-ричное число. Можно попробовать преобразовать его в 32-ричную систему. Заодно и разнообразие букв вырастет.
 

Kelkos

Сам себе программер
Тяжко..
16 ричное число - это число в диапазоне 0..255 записываемое двумя символами 0..9 A..F и как его прегнать в 32-ричную систему (и что это такое вообще) я незнаю.

-~{}~ 26.06.04 20:39:

Аа.. кажется я понял, что ты хочешь.. Типа увеличить диапазон символов с A..F до A..Z ?
Можно, конечно, но этот вопрос к криптографистам или математикам. Нужно ведь алгоритм не имеющий "подводных камней". Скорее всего такой алгоритм ужо есть.. может кто слышал?
 

IL78

Guest
Kelkos,

для перевода чисел из одной системы счисления в другую есть стандартная ф-ция base_convert().

1 байт, который записывается двумя 16-ричными цифрами, в 32-ричной можно записать 1 "цифрой" => для записи 128 бит (16 байт) хэша нужно ровно 16 символов.

Чтобы получить диапазон 0-9a-z, нужна 36-ричная система.
 

neko

tеam neko
алгоритм MD5 дает 128-битный дайджест
т.е. 16 байт

то что оно выдается в виде 32ух читаемых хексадемикал символов это уже "издержки пхп"

далее поехали.
в 5той версии вышеупомянутого изобретения появился параметр к md5() -- raw_output который выдает хэш "как есть"
т.е. 16 байт, не больше

еще можно пользоваться pack()

ну и наш любимый вопрос: чем 32 символа тебе неугодили?

-~{}~ 26.06.04 23:17:

Originally posted by Kelkos
Ну отрежь первую (или вторую) половину от строки md5 и будет тебе 16 символов. А чем 32 не устраивает то?
голову себе отреж, все равно не пользуешься
 

Vadimka

Новичок
надо зашифровать пароль и положить в базу, только ради уменьшения места ложит захешированый парольне в 32 символа а допустим в 16 символов? возможно это?
 

IL78

Guest
Vadimka, это возможно. neko подсказал пару идей. Но учти, что тебе придется преобразовывать точно таким же образом то, что ты будешь сравнивать с этим хэшем. Стоит ли овчинка выделки?

P.S. Насчет системы с основанием 32 я все же конкретно ошибся. Конечно же, чтобы записать 1 байт одним знаком, разнообразие знаков должно быть не 32, а целых 256. base_convert тут, увы, бессилен. Странно, что до сих пор мне на это не указали...
 

lucas

Guest
Vadimka

ради уменьшения места ложит захешированый парольне в 32 символа а допустим в 16 символов
Правильный ответ здесь: ТЕБЕ ЭТО НЕ НУЖНО.
Экономить на длине хэша от пароля в базе не имеет никакого смысла.

Никогда не поверю, что у тебя есть таблица юзеров, размер которой, если уменьшить вдвое хэш пароля, сократится эдак на пару терабайтов.
 

valyala

Новичок
Vadimka, если уж тебе так необходимо упаковать 32 символа, что возвращает РНР-шная функция md5(), в 16, то лучше всего послушаться neko и применить pack():
PHP:
function md5_pack($str)
{
  return pack('H*', md5($str));
}
Можно послушаться Kelkos'а и просто вырезать любые 16 символов из строки, которую возвращает md5(). Например, следующая функция вырезает первые 16 символов:
PHP:
function md5_cut($str)
{
  return substr(md5($str), 0, 16);
}
Но этот способ снижает криптостойкость хэша md5() в 2^64 = 18446744073709551616 раз. Так что вначале подумай, что для тебя более важно - безопасность паролей или размер таблицы.
 

neko

tеam neko
Можно послушаться Kelkos'а и просто вырезать любые 16 символов из строки, которую возвращает md5().
вот от тебя такого услышать не ожидал

за каким чертом тогда использовать md5
это не то что криптостойкость снижает
это повышает вероятность совпадения дайджестов
причем повышает, прилично так.

давайте уж тогда, циклик ренунданси чек (или как оно) считайте!!!

...
 

tristram

Guest
<?php
$text = "вася";
$hash = substr(md5($text),0,16);
?>

это самый лучший вариант.

-~{}~ 01.07.04 22:13:

neko, :)))) гыг. каким макаром ? если и будут совпадать то явно больше 15 символов (т.е длины макс пасса)!
 

b0ld

Guest
Напиши свой алгоритм лоширования. Можно даже в 4 символа уложиться :p
 

valyala

Новичок
Если кому-нибудь нужно найти строку, соответствующую известному вам 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");

?>
 

Kelkos

Сам себе программер
Например, если добавлять к паролю, выбранному пользователем, случайную строку символов,
Хм.. зачем? Вводим на сайте новую константу - секретное слово.. с его помощью и работаем.. подставляем в строку и генерим md5.

Valyala, что то я не догнал, как твой скрипт работает.. :( .. как ты при генерировании для сверки опять получем точно такоеже случайное число?
 

valyala

Новичок
Хм.. зачем? Вводим на сайте новую константу - секретное слово.. с его помощью и работаем.. подставляем в строку и генерим md5.
Такое решение тоже имеет право на жизнь. Оно все же лучше, чем просто md5(password) - если не знаешь секретное слово, то атака по словарю из наиболее вероятных паролей исключена. Но если злоумышленник доберется до секретного слова, то ему не составит труда организовать одновременный подбор всех захэшированных паролей по словарю. И чем больше у него в руках хэшей, тем быстрее он сумеет подобрать хотя бы один пароль. А вот если секретное слово одновременно является случайной строкой, то компрометация любой случайной строки никак не влияет на защищенность остальных паролей - словарная атака будет возможна только на хэш, связанный со скомпрометированной случайной строкой.

Valyala, что то я не догнал, как твой скрипт работает..
Я объяснять не умею. Попробуй разобраться самостоятельно - скрипт-то совсем небольшой :)
 
Сверху