Для тех, кто практикуется..

Discussion in 'PHP' started by uvartyom, 27 Aug 2009.

  1. uvartyom

    uvartyom New Member

    Joined:
    27 Aug 2009
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Вечер добрый.

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

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

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

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

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

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

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


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

    Code:
    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;
    }
     
  2. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    836
    Reputations:
    402
    т.е. тебе надо, фактически, написать на php свой рабочий модуль авторизации\регистрации.

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

    uvartyom New Member

    Joined:
    27 Aug 2009
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    т.е.:
    include ("файл форума с хешем");
    if ($hash = phpbb_hash($_POST['pass'])) {...}
    else {...}

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

    Rebz Super Moderator
    Staff Member

    Joined:
    8 Nov 2004
    Messages:
    4,055
    Likes Received:
    1,532
    Reputations:
    1,128
    У тебя пароли хранятся в файлах? А не проще ли в БД?
     
  5. Krist_ALL

    Krist_ALL Banned

    Joined:
    14 Jan 2009
    Messages:
    436
    Likes Received:
    193
    Reputations:
    24
    $hash = phpbb_hash($_POST['pass']); //переменная hash содержит хеш, полученый от функции phpbb_hash

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