Как сгенерировать соль пароля vBulletin для хеша md5 при импорте пользовательских данных? - PullRequest
2 голосов
/ 04 октября 2009

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

Я хочу, чтобы скрипт делал это, иначе он будет длиться вечно.

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

Но, конечно, это не работает с vBulletin из-за солей и т. Д.

Итак, мой код такой:

<?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 field и пользователя vBulletin. salt правильно Помните, что мой $ user [пароль] или users. password хранится как хэш md5 их реального текстового пароля.

Спасибо!

Ответы [ 4 ]

4 голосов
/ 04 февраля 2010

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

vBulletin генерирует свои хэши следующим образом:

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

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

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

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

1 голос
/ 04 октября 2009

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

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

0 голосов
/ 22 июня 2012

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

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

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

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

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`;

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

Если вы добавили какие-либо настраиваемые поля профиля, вам нужно перенести эту информацию в таблицу пользовательских полей:

  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;
0 голосов
/ 19 февраля 2010

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

md5(md5(passowrd).salt);
...