2009-10-04 190 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;