Перейти к контенту
  • 0

Шифрование в 2.0.0


Axxent

Вопрос

Столкнулся с проблемой, у меня заказ по работе обновить сайт, требуется обновить стоящий там форум на более современный (я выбрал Inv 2.0.0) с сохранением всех сообщений и прочего, включая инфу о пользователях итп. Встрял на том, как сохранить пароли юзеров. Старый форум (YaBB 2) хранит их в нешифрованном виде, в базе инвизиона вижу какой-то странный хеш. Явно не md5, по крайней мере не один md5. Подскажите кто может по какому алгоритму шифруются пароли в инвизионе, я мог бы и сам найти, но это _срочно_, нет времени копаться в исходниках, а пароли шифрануть надо! Хелп! :D
Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0

гы вообщем процес авторизаци/регистрации таков (вроде)

1. единожды при регистрации создается поле в базе ibf_members_converge "converge_pass_salt"

 

процедура создания такая

 

 function generate_password_salt($len=5)
{
 $salt = '';
 
 srand( (double)microtime() * 1000000 );
 
 for ( $i = 0; $i < $len; $i++ )
 {
	 $num   = rand(33, 126);
	 
	 if ( $num == '92' )
	 {
   $num = 93;
	 }
	 
	 $salt .= chr( $num );
 }
 
 return $salt;
}

 

то есть идет привязка ко времени регистрации потом хитрый метод создания кода:)

 

затем при регистрации же создается поле "converge_pass_hash" в той же базе которое привязано к предыдущему полю..

 function generate_compiled_passhash($salt, $md5_once_password)
{
 return md5( md5( $salt ) . $md5_once_password );
}

и поле это тоже постоянно

в качестве $md5_once_password - передается наш пароль в md5 кодировании

так же при регистрации создается поле в базе ibf_members "member_login_key"

 function generate_auto_log_in_key($len=60)
{
 $pass = $this->generate_password_salt( 60 );
 
 return md5($pass);
}

поле это меняется каждый раз при каждом залогинивании на форуме..

 

так же при регистрации создается

	 $validate_key = md5( $std->make_password() . time() );

 function make_password()
{
 $pass = "";
 $chars = array(
	 "1","2","3","4","5","6","7","8","9","0",
	 "a","A","b","B","c","C","d","D","e","E","f","F","g","G","h","H","i","I","j","J",
	 "k","K","l","L","m","M","n","N","o","O","p","P","q","Q","r","R","s","S","t","T",
	 "u","U","v","V","w","W","x","X","y","Y","z","Z");

 $count = count($chars) - 1;

 srand((double)microtime()*1000000);

 for($i = 0; $i < 8; $i++)
 {
	 $pass .= $chars[rand(0, $count)];
 }

 return($pass);
}

которое посылается по мылу для активации на форуме ника, если конечно это включено в админке форума..

 

КАК ЛОГИНИТСЯ МЕМБЕР

1.сначала проверяется как логинится - по мылу или по нику..

2.идет проверка на существование ника

3. идет проверка пароля

	 if ( $ibforums->converge->converge_authenticate_member( $password ) != TRUE )
 {
	 $this->log_in_form( 'wrong_pass' );
 }

 

 function converge_authenticate_member( $md5_once_password )
{
 if ( ! $this->member['converge_pass_hash'] )
 {
	 return FALSE;
 }
 
 if ( $this->member['converge_pass_hash'] == $this->generate_compiled_passhash( $this->member['converge_pass_salt'], $md5_once_password ) )
 {
	 return TRUE;
 }
 else
 {
	 return FALSE;
 }
}

и если нет автолигои_кей , то создается новый..

 

	 //-------------------------------------------------
 // No member log in key?
 //-------------------------------------------------
 
 if ( ! $member['member_login_key'] )
 {
	 $member['member_login_key'] = $ibforums->converge->generate_auto_log_in_key();
 
	 $DB->do_update( 'members', array( 'member_login_key' => $member['member_login_key'] ), 'id='.$member['id'] );
 }

 

вот вроде все.. ;) расскрыли все секреты шифрования..

 

теперь по теме..

бось врятли удастся сохранить пароли :D если только сможете повторить все кодирования, НО вам еще нужно знать кодирования старогго форума..

вообщем ИМХО проще заставить потом юзверей юзать "восстановление паролей"

Ссылка на комментарий
Поделиться на других сайтах

  • 0
А разве конвертор не обязан привести в норимальное состояние базу сам ?

хм.. если пароли кодированы изначально, то никак точно не получится, обратного декодирования из md5 вроде нет..

но вот создатель темы пишет что пароли хранятся в открытом виде.. неужели правда :D

Ссылка на комментарий
Поделиться на других сайтах

  • 0
да-да. Чистая правда. YaBB Gold хранит пароли в нешифрованном виде в файлах самих пользователей. Это не есть гуд, но для перехода на новый форум это очень хорошо. Из md5 можно восстановить пароль брутфорсом, но это долго, а при 7 тыщах юзеров это делать запарит ;) Спасибо огромное за помощь. :D
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Axxent

у тебя получилось? тоже пытаюсь сконвертить все пароли, но что-то не получается...

 

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

 

Добавлено в [mergetime]1108067530[/mergetime]

блин, не заметил сначало, что говорят про 2.0 - я уж обрадовался... у меня 1.3 ;)

Добавлено в [mergetime]1108068082[/mergetime]

вопрос снят. :D спасибо.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Я всё правильно понял, member_login_key никак не связан функционально с реальными переменными converge_pass_hash и salt, и вытащить их зная member_login_key всё равно нельзя?
Ссылка на комментарий
Поделиться на других сайтах

  • 0
да-да. Чистая правда. YaBB Gold хранит пароли в нешифрованном виде в файлах самих пользователей. Это не есть гуд, но для перехода на новый форум это очень хорошо. Из md5 можно восстановить пароль брутфорсом, но это долго, а при 7 тыщах юзеров это делать запарит ;) Спасибо огромное за помощь. :D

Откуда беруться такие умники?

 

MD5 - функция ХЕШИРОВАНИЯ, т.е. подсчёта контрольной суммы.

 

Брутфорус позволяет лишь найти одно из значений хеша, коллизию.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Здравствуйте.

 

Не понимаю в чем дело, необходимо сделать добавление пользователя в базу IPB через скрипт (про SDK знаю).

 

Сделал подобное:

<?php

function create_account($username, $password, $email) {

	$member = array(
					 'name'			 => $username,
					 'member_login_key' => generate_auto_log_in_key(),
					 'email'			=> $email,
					 'mgroup'		   => 3,//$this->ips->vars['member_group'],
					 'posts'			=> 0,
					 'joined'		   => time(),
					 'ip_address'	   => "",
					 'time_offset'	  => "",
					 'view_sigs'		=> 1,
					 'email_pm'		 => 1,
					 'view_img'		 => 1,
					 'view_avs'		 => 1,
					 'restrict_post'	=> 0,
					 'view_pop'		 => 1,
					 'msg_total'		=> 0,
					 'new_msg'		  => 0,
					 'coppa_user'	   => 0,
					 'language'		 => "ru",
					 'dst_in_use'	   => 0,
					 'allow_admin_mails'=> 1,
					 'hide_email'	   => 0,
					 'subs_pkg_chosen'  => 0,
					 'members_display_name' => $username
				   );

	$salt	 = generate_password_salt(5);
	$passhash = generate_compiled_passhash( $salt, md5($password) );

	$converge = array( 'converge_email'	 => $email,
					   'converge_joined'	=> time(),
					   'converge_pass_hash' => $passhash,
					   'converge_pass_salt' => str_replace( '\\', "\\\\", $salt )
					 );


	mysql_qw("INSERT INTO ibf_members_converge
	SET converge_email = ?, converge_joined = ?, converge_pass_hash = ?, converge_pass_salt = ?",
	$email, time(), $passhash, str_replace( '\\', "\\\\", $salt )
	) or die(mysql_error());

	$member['id'] = mysql_insert_id();

	mysql_qw('INSERT INTO ibf_members
	SET id = ?, name = ?, member_login_key = ?, email = ?, mgroup = ?, joined =?, members_display_name = ?',
	$member['id'], $member['name'], $member['member_login_key'], $member['email'], $member['mgroup'], $member['joined'], $member['members_display_name']
	) or die(mysql_error());

	$validate_key = md5( make_password() . time() );
	$time		 = time();

	mysql_qw('INSERT INTO ibf_validating
	SET vid = ?, member_id = ?, real_group = ?, temp_group = ?, entry_date = ?',
	$validate_key, $member['id'], 3, 3, $time
	) or die(mysql_error());				

	return $member['id'];
}

function generate_auto_log_in_key($len=60) {
	$pass = generate_password_salt( 60 );

	return md5($pass);
}

function generate_password_salt($len=5)
{
	$salt = '';

	//srand( (double)microtime() * 1000000 );
	// PHP 4.3 is now required ^ not needed

	for ( $i = 0; $i < $len; $i++ )
	{
		$num   = rand(33, 126);

		if ( $num == '92' )
		{
			$num = 93;
		}

		$salt .= chr( $num );
	}

	return $salt;
}

function generate_compiled_passhash($salt, $md5_once_password)
{
	return md5( md5( $salt ) . $md5_once_password );
}

function make_password()
{
	$pass = "";

	// Want it random you say, eh?
	// (enter evil laugh)

	$unique_id 	= uniqid( mt_rand(), TRUE );
	$prefix		= generate_password_salt();
	$unique_id .= md5( $prefix );

	usleep( mt_rand(15000,1000000) );
	// Hmm, wonder how long we slept for

	mt_srand( (double)microtime()*1000000 );
	$new_uniqueid = uniqid( mt_rand(), TRUE );

	$final_rand = md5( $unique_id.$new_uniqueid );

	mt_srand(); // Wipe out the seed

	for ($i = 0; $i < 15; $i++)
	{
		$pass .= $final_rand{ mt_rand(0, 31) };
	}

	return $pass;
}

echo create_account("new_user", "new_user", "new_user@mail.ru");


?>

 

Все данные заносятся в базу, но пользователь не авторизуется. В чем может быть проблема?

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.