PDA

Просмотр полной версии : Для тех, кто практикуется..


uvartyom
27.08.2009, 23:16
Вечер добрый.

В заранее попрошу без оскорблений и мата, я всего 2й месяц web-программирование изучаю.

Недавно столкнулся с проблемой, и для меня она показалась серьезной..

Перебивал под себя форум с открытым исходником, называется phpbb 3.0.5, там столкнулся с непонятным для меня хешированием md5(phpbb).

в mysql пароль выглядит так: $H$9N7lGJXtfWooQuiHNGoOEQE/kI5b.p/
соль: 88ca5851fa9f3ce3
логин: Zxcvbn
пароль: 123456

Если кто в состоянии помочь - в заранее огромное спасибо!

Нашел файл, отвечающий за хеширование, но не хватает опыта..

Нужно сделать свою Авторизацию и Регистрацию, а точнее создать файл, хеширующий пароли и сравнивающий хеш с введенным.


Вот код, с того файла, который я нашел:


function phpbb_hash($password)
{
$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn opqrstuvwxyz';

$random_state = unique_id();
$random = '';
$count = 6;

if (($fh = @fopen('/dev/urandom', 'rb')))
{
$random = fread($fh, $count);
fclose($fh);
}

if (strlen($random) < $count)
{
$random = '';

for ($i = 0; $i < $count; $i += 16)
{
$random_state = md5(unique_id() . $random_state);
$random .= pack('H*', md5($random_state));
}
$random = substr($random, 0, $count);
}

$hash = _hash_crypt_private($password, _hash_gensalt_private($random, $itoa64), $itoa64);

if (strlen($hash) == 34)
{
return $hash;
}

return md5($password);
}

/**
* Check for correct password
*
* @param string $password The password in plain text
* @param string $hash The stored password hash
*
* @return bool Returns true if the password is correct, false if not.
*/
function phpbb_check_hash($password, $hash)
{
$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn opqrstuvwxyz';
if (strlen($hash) == 34)
{
return (_hash_crypt_private($password, $hash, $itoa64) === $hash) ? true : false;
}

return (md5($password) === $hash) ? true : false;
}

/**
* Generate salt for hash generation
*/
function _hash_gensalt_private($input, &$itoa64, $iteration_count_log2 = 6)
{
if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
{
$iteration_count_log2 = 8;
}

$output = '$H$';
$output .= $itoa64[min($iteration_count_log2 + ((PHP_VERSION >= 5) ? 5 : 3), 30)];
$output .= _hash_encode64($input, 6, $itoa64);

return $output;
}

/**
* Encode hash
*/
function _hash_encode64($input, $count, &$itoa64)
{
$output = '';
$i = 0;

do
{
$value = ord($input[$i++]);
$output .= $itoa64[$value & 0x3f];

if ($i < $count)
{
$value |= ord($input[$i]) << 8;
}

$output .= $itoa64[($value >> 6) & 0x3f];

if ($i++ >= $count)
{
break;
}

if ($i < $count)
{
$value |= ord($input[$i]) << 16;
}

$output .= $itoa64[($value >> 12) & 0x3f];

if ($i++ >= $count)
{
break;
}

$output .= $itoa64[($value >> 18) & 0x3f];
}
while ($i < $count);

return $output;
}

/**
* The crypt function/replacement
*/
function _hash_crypt_private($password, $setting, &$itoa64)
{
$output = '*';

// Check for correct hash
if (substr($setting, 0, 3) != '$H$')
{
return $output;
}

$count_log2 = strpos($itoa64, $setting[3]);

if ($count_log2 < 7 || $count_log2 > 30)
{
return $output;
}

$count = 1 << $count_log2;
$salt = substr($setting, 4, 8);

if (strlen($salt) != 8)
{
return $output;
}

/**
* We're kind of forced to use MD5 here since it's the only
* cryptographic primitive available in all versions of PHP
* currently in use. To implement our own low-level crypto
* in PHP would result in much worse performance and
* consequently in lower iteration counts and hashes that are
* quicker to crack (by non-PHP code).
*/
if (PHP_VERSION >= 5)
{
$hash = md5($salt . $password, true);
do
{
$hash = md5($hash . $password, true);
}
while (--$count);
}
else
{
$hash = pack('H*', md5($salt . $password));
do
{
$hash = pack('H*', md5($hash . $password));
}
while (--$count);
}

$output = substr($setting, 0, 12);
$output .= _hash_encode64($hash, 16, $itoa64);

return $output;
}

ErrorNeo
28.08.2009, 00:23
т.е. тебе надо, фактически, написать на php свой рабочий модуль авторизации\регистрации.

К хешкрекингу тема отношения не имеет, потому переношу в раздел вопросов по php

uvartyom
28.08.2009, 13:44
что мешает заюзать phpBB'шные функи?

//инклюдим файл функций хеширования

$hash = phpbb_hash($_POST['pass']);

//сраванение в БД или где-нить там


если хочешь готовое - иди в раздел "О работе"

т.е.:
include ("файл форума с хешем");
if ($hash = phpbb_hash($_POST['pass'])) {...}
else {...}

Если так, то выводит else.. или я что-то не допонял??

Rebz
28.08.2009, 13:48
include ("файл форума с хешем");
У тебя пароли хранятся в файлах? А не проще ли в БД?

Krist_ALL
28.08.2009, 13:52
$hash = phpbb_hash($_POST['pass']); //переменная hash содержит хеш, полученый от функции phpbb_hash

$hash2 = ... //достаем из базы хеш, который соответствует пользователю, который хочет залогнится
//ну или из файла,, как тебе нравится. Лучше в бд переведи учетки юзеров.
if($hash == $hash2) {echo ' OK'; }
else echo 'error';