Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Для тех, кто практикуется.. (https://forum.antichat.xyz/showthread.php?t=137806)

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 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

        $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 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
        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

Цитата:

Сообщение от FireFenix
что мешает заюзать phpBB'шные функи?
PHP код:

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

$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';


Время: 22:04