2009-10-04 1 views
2

Я переношу пользователей из своей старой базы данных в базу данных vBulletin.Как я могу сгенерировать соль паролей vBulletin для хеша md5 при импорте пользовательских данных?

Я хочу, чтобы сценарий делал это, так как это будет навсегда.

Я все пароли на пользователе хранится так же, как md5 (пароль)

Но, конечно, это не работает с Справкой из-за соли и т.д.

Так что мой код это:

<?Php 
mydatabase_connect(); 
$select=mysql_query("SELECT * from `users`"); 
while($user=mysql_fetch_array($select)) { 

    forum_connect(); 
    $check=mysql_query("SELECT * from `user` where `username` = '{$user[username]}'"); 
    if(mysql_num_rows($check)>="1") { 
     echo "fail"; 
     }else{ 
     $insert=mysql_query("INSERT into `user` SET `username` = '{$user[username]}', `password` = '{$user[password]}', `email` = '{$user[email]}'"); 
     if($insert) { 
      echo 'success'; 
      }else{ 
      echo 'fail'; 
     } 
    } 
    mydatabase_connect(); 
} 
?> 

Как я могу изменить его для работы с vBulletin - так что я могу задать пользователю vBulletin. password Поле и пользователь vBulletin. salt правильно. Принимая во внимание, что мой $ user [пароль] или users. password хранится в виде хеша md5 своего реального текстового пароля.

Спасибо!

+0

Из-за необычайно слабой схемы хэширования страниц, используемой vbulletin и другими дырами в нем, я думаю, вы должны предположить, что все эти пароли были скомпрометированы и заставили всех пользователей обновить свои пароли. Учитывая, насколько плохи были, казалось бы, прайсы, вы, возможно, захотите перейти на форум, написанный людьми, которые знают и заботятся намного больше о безопасности. См. [vBulletin взломает опасения о серьезных интернет-атаках в течение 0 дней | Ars Technica] (http://arstechnica.com/security/2015/11/vbulletin-password-hack-fuels-fears-of-serious-internet-wide-0-day-attacks/) – nealmcb

ответ

1

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

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

+1

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

4

Я не знаю, был ли этот ответ слишком запоздалым, но вы должны иметь возможность автоматически передавать свои пароли в vBulletin.

форум генерирует хэш таким образом:

$hash = md5(md5($plaintext) . $salt); 

Таким образом, для передачи пользователей более, сделать примерно следующее:

$salt = /* generate salt */; 
$vb_hash = md5($your_old_hash . $salt); 

Чтобы сделать это легко на себя, использовать метод генерации соли форума по , Он находится в классе vB_DataManager_User.

0

это работало для меня

md5(md5(passowrd).salt); 
0

Я приспособил процесс я использовал для передачи пользовательской информации из существующей базы данных в базу данных VBulletin. Он использует запросы к базе данных, введенные через клиент командной строки MySQL, не требуется обработка PHP.

Он работает для сценария, описанного: что пароли в существующей базе данных хранятся с использованием md5(password).

Обе базы данных находятся на одном сервере, vBulletin 4.х

будут созданы три хранимые функции:

vbulletin.userTitle() // Convert user type from current db to a user title 

vbulletin.groupId() // Convert current user type into permission group ID 

vbulletin.randomSalt() // Create salt using same approach as used by vbulletin 

Войти через клиент MySQL: mysql --user=xxx -p vbulletin

Создание хранимых функций:

delimiter // 
    CREATE FUNCTION vbulletin.userTitle(mtype VARCHAR(255)) 
    RETURNS CHAR(250) 
    NO SQL 

    BEGIN 
    DECLARE userTypeTitle CHAR(250) DEFAULT ""; 

    CASE mtype 
     WHEN 'user' THEN SET userTypeTitle = 'Member'; 
     WHEN 'admin' THEN SET userTypeTitle = 'Administrator'; 
     WHEN 'moderator' THEN SET userTypeTitle = 'Regional Moderator'; 
     ELSE 
     SET userTypeTitle = 'Member'; 
    END CASE; 

    RETURN userTypeTitle; 
    END// 

    CREATE FUNCTION vbulletin.groupId(mtype VARCHAR(255)) 
    RETURNS smallint(5) 
    NO SQL 

    BEGIN 
    DECLARE groupTypeId smallint(5) DEFAULT 0; 

    CASE mtype 
     WHEN 'user' THEN SET groupTypeId = 2; 
     WHEN 'admin' THEN SET groupTypeId = 6; 
     WHEN 'moderator' THEN SET groupTypeId = 11; 
     ELSE 
     SET groupTypeId = 12; 
    END CASE; 

    RETURN groupTypeId; 
    END// 

    CREATE FUNCTION vbulletin.randomSalt() 
    RETURNS CHAR(30) 
    READS SQL DATA 

    BEGIN 
    DECLARE count INT DEFAULT 0; 
    DECLARE rn1 CHAR; 
    DECLARE saltout VARCHAR(30) DEFAULT ""; 

    WHILE count<30 DO 
     SET count = count+1; 
     SET rn1 = CHAR(FLOOR(33 + (RAND() * 93))); 
     SELECT CONCAT(saltout, rn1) INTO saltout; 
    END WHILE; 

    RETURN saltout; 
    END// 
    delimiter ; 

Резервное копирование баз данных перед передачей пользовательской информации.

В базе данных vbulletin имеется вся информация, используемая при настройке и тестировании, поэтому пустые три таблицы, которые мы будем обновлять.

TRUNCATE `vbulletin`.`user`; 
    TRUNCATE `vbulletin`.`userfield`; 
    TRUNCATE `vbulletin`.`usertextfield`; 

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

Заполните основную таблицу пользователя.
Соль генерируется через сохраненную функцию для каждой строки в существующей пользовательской таблице.
хэшированный пароль из существующей базы данных хешируются с солью, когда она вставлена ​​в базу данных VBulletin, как это:
MD5(current_hashed_password + new_salt)

Основного запрос:

INSERT INTO `vbulletin`.`user` (
    `userid`, `username`, `salt`, `password`, `email`, `passworddate`, `styleid`, `showvbcode`, `joindate`, `lastvisit`, `lastactivity`, `reputationlevelid`, `timezoneoffset`, `usergroupid`, `usertitle` 
) 
    SELECT 
    `current_userid`, `current_username`, vbulletin.randomSalt() as new_salt, MD5(current_hashed_password + new_salt), `current_email`, CURDATE(), 5, 2, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 5, 0, vbulletin.groupId(current_type), vbulletin.userTitle(current_type) 
    from `current_database`.`user`; 

Следующие запросы добавить по умолчанию записи для каждого пользователя.

Если вы добавили настраиваемые поля профиля, вы хотите, чтобы передать эту информацию в userfield таблице:

INSERT INTO `vbulletin`.`userfield` (
    `userid`, `field5`, `field6` 
) 
    SELECT 
    `current_userid`, `firstname`, `lastname` 
    from `current_database`.`user`; 


    INSERT INTO `vbulletin`.`usertextfield` (
    `userid` 
) 
    SELECT `current_userid` 
    from `current_database`.`user`; 

Установите уровень репутации для администратора пользователей группы:

UPDATE `vbulletin`.`user` SET `reputationlevelid` = 1 WHERE `usergroupid` = 6; 

Удалить сохраненные функции, они не будут использоваться снова:

DROP FUNCTION vbulletin.userTitle; 
    DROP FUNCTION vbulletin.groupId; 
    DROP FUNCTION vbulletin.randomSalt; 
Смежные вопросы