2009-10-04 193 views
2

我将用户从旧数据库传输到vBulletin数据库。如何在导入用户数据时为md5哈希生成vBulletin密码salt?

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

我已存储就像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字段和vBulletin用户。 salt正确。请记住,我的$用户[密码]或userspassword存储为其真实文本密码的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 2016-02-13 21:19:05

回答

1

如果您的旧系统使用了未加密的哈希,并且vBulletin使用了加盐的哈希,那么如果您希望用户保留密码,则必须修改vBulletin以使用未加密的哈希。我不熟悉vBulletin代码,但如果每个用户都有自己的salt值,也许只需将它设置为空字符串即可。

如果失败,请编写一个页面以使用户能够转换到新系统。您可以在用户登录失败时将用户引导至页面,并且会检查他们对旧系统的凭据,并为新系统创建新的salt和散列。

+1

每个用户都有自己的盐的价值,我会想象选项二是最安全/最好的选择。第一种解决方案还意味着你将通过每次更新来进行代码更改,虽然这不一定是主要问题,但随着时间的推移它会面临一系列挑战。 – 2009-10-06 00:50:42

4

我不知道这个答案是否太晚,但你应该能够自动将你的密码转移到vBulletin中。

vBulletin生成其哈希是这样的:

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

所以,用户在传输,做到大致有以下几种:

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

为了方便自己,使用vBulletin的盐生成方法。它在vB_DataManager_User类中。

0

这个工作对我来说

md5(md5(passowrd).salt); 
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;