Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
Для тех, кто практикуется.. |

27.08.2009, 23:16
|
|
Новичок
Регистрация: 27.08.2009
Сообщений: 2
Провел на форуме: 2242
Репутация:
0
|
|
Для тех, кто практикуется..
Вечер добрый.
В заранее попрошу без оскорблений и мата, я всего 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;
}
|
|
|

28.08.2009, 00:23
|
|
Moderator - Level 7
Регистрация: 02.05.2009
Сообщений: 894
Провел на форуме: 4297091
Репутация:
2261
|
|
т.е. тебе надо, фактически, написать на php свой рабочий модуль авторизации\регистрации.
К хешкрекингу тема отношения не имеет, потому переношу в раздел вопросов по php
|
|
|

28.08.2009, 13:44
|
|
Новичок
Регистрация: 27.08.2009
Сообщений: 2
Провел на форуме: 2242
Репутация:
0
|
|
Сообщение от FireFenix
что мешает заюзать phpBB'шные функи?
PHP код:
//инклюдим файл функций хеширования
$hash = phpbb_hash($_POST['pass']);
//сраванение в БД или где-нить там
если хочешь готовое - иди в раздел "О работе"
т.е.:
include ("файл форума с хешем");
if ($hash = phpbb_hash($_POST['pass'])) {...}
else {...}
Если так, то выводит else.. или я что-то не допонял??
|
|
|

28.08.2009, 13:48
|
|
Super Moderator
Регистрация: 08.11.2004
Сообщений: 3,395
Провел на форуме: 13166814
Репутация:
3876
|
|
include ("файл форума с хешем");
У тебя пароли хранятся в файлах? А не проще ли в БД?
|
|
|

28.08.2009, 13:52
|
|
Banned
Регистрация: 14.01.2009
Сообщений: 515
Провел на форуме: 1996429
Репутация:
468
|
|
$hash = phpbb_hash($_POST['pass']); //переменная hash содержит хеш, полученый от функции phpbb_hash
$hash2 = ... //достаем из базы хеш, который соответствует пользователю, который хочет залогнится
//ну или из файла,, как тебе нравится. Лучше в бд переведи учетки юзеров.
if($hash == $hash2) {echo ' OK'; }
else echo 'error';
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|