Перейти к контенту
  • 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");


?>

 

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

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

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

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

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

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

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

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

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

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