2

我正在将用户从旧数据库转移到 vBulletin 数据库。

我想要一个脚本来做到这一点,否则它将永远持续下去。

我存储了所有用户的密码,就像 md5(password)

但当然,由于盐等原因,这不适用于 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字段和 vBulletin 用户。salt正确。请记住,我的 $user[password] 或users. password存储为他们真实的文本密码的 md5 哈希。

谢谢!

4

4 回答 4

4

我不知道这个答案是否为时已晚,但您应该能够自动将您的密码传输到 vBulletin。

vBulletin 以这种方式生成其哈希值:

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

因此,要转移用户,大致执行以下操作:

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

为了让自己更轻松,请使用 vBulletin 的盐生成方法。它在 vB_DataManager_User 类中。

于 2010-02-04T20:09:57.937 回答
1

如果您的旧系统使用未加盐的哈希,而 vBulletin 使用加盐的哈希,那么如果您希望用户保留他们的密码,您将不得不修改 vBulletin 以使用未加盐的哈希。我不熟悉 vBulletin 代码,但如果每个用户都有自己的盐值,也许只需将其设置为空字符串就足够了。

如果做不到这一点,请编写一个页面以使用户能够过渡到新系统。当用户登录失败时,您可以将用户引导到一个页面,它会根据旧系统检查他们的凭据,并为新系统创建新的盐和哈希。

于 2009-10-04T14:35:49.623 回答
0

这对我有用

md5(md5(passowrd).salt);
于 2010-02-18T22:06:33.617 回答
0

我已经调整了用于将用户信息从现有数据库传输到 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`;

以下查询为每个用户添加默认条目。

如果您添加了任何自定义配置文件字段,您需要将该信息传输到 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;
于 2012-06-22T02:27:04.963 回答