2012-09-03 37 views
0

我在一個需要快速解決方案的問題。我會盡力解釋它。Wordpress/codeigniter傳輸sql數據庫密碼

我有表wp_user(來自WordPress),其中所有成員都有使用wordpress加密函數加密的密碼。我必須將這個表格轉移到與Codeigniter合作的新網站上的新的Mysql數據庫。

對於在codeigniter下工作的新站點上的新成員,我使用MD5函數來掩碼密碼。

但問題是,這兩個功能是不同的,因此,當一個老用戶嘗試在我的新網站連接,不工作,因爲密碼不匹配......

所以,如何在正常的MD5密碼中翻譯wordpress encrpyting?

或者也許這是不可能的?

回答

1

不幸的是,你必須執行兩個檢查,或者只是改變CI來使用與WP相同的哈希方案。這可能是更容易的選擇。如果你真的想開始使用默認的CI哈希方案,你可以存儲哈希值,並在成功登錄時更新新哈希值(當你有明文密碼時)。

+0

好的thx,所以我必須找到函數在wordpress中加密密碼... 你知道我在哪裏可以找到它嗎? – Necko

+0

如果您使用的是WP的最新版本,它是'wp-includes/pluggable.php'中的'wp_hash_password'。這將開始你的蹤跡。實際使用的算法取決於您的設置。 –

1

我不熟悉什麼樣的哈希Wordpress使用密碼,但我認爲它是安全的和不可逆轉的。散列密碼不能將轉換爲它們的MD5等價物,因爲散列是單向算法。

這裏是我的建議給你:

在您的新網站添加一個using_md5_flag布爾列到用戶表默認值0。從WordPress的過度複製密碼到一列wppassword並創建一個名爲md5password列當用戶登錄到系統中執行以下代碼(假設DataMapper的ORM,轉換爲活動記錄,如果你需要):

$u = new User(); 
$u->where('username', $this->input->post('username'))->get(); 

$y = new User(); 
$y->where('username', $this->input->post('username')); 
if($u->using_md5_flag){ 
    /*the flag is 1*/ 
    $y->where('md5password', md5($this->input->post('password'))); 
    $y->get(); 
    if($y->exists()) echo "setting cookie and redirecting to logged in area"; 
    else echo "Wrong credentials!"; 
} 

else{ 
    /*the flag is 0, use wordpress's hashing algorithm (not sure what this is)*/ 
    $y->where('wppassword', wp_hashing_algo($this->input->post('password'))); 
    $y->get(); 
    if($y->exists()){ 
     /*set the using_md5_flag flag so next time they log in it will ignore wp's*/ 
     $y->using_md5_flag = 1; 
     /*set the new md5 password.*/ 
     $y->md5password = md5($this->input->post('password')); 
     $y->save(); 
     echo "setting cookie and redirecting to logged in area"; 
    } 
    else{ 
     echo "Wrong credentials."; 
    } 
} 

這代碼尚未經過測試,我在StackOverflow的編輯器中編寫了它......但這是我執行慢速轉換爲更安全哈希的方法。最後,如果你正在尋找一個真正安全的散列,請查看Bcrypt(phpass),它更能抵抗彩虹表攻擊。


更新1:如果您需要使用Phpass庫笨,你可以找到一個副本我修改here(我添加了一個構造函數)。把這個libraries/Phpass.php您可以通過使用該庫在控制器中:

$this->load->library("phpass", array("iteration_count_log2" => 8, "portable_hashes" => FALSE)); 
$check = $this->phpass->CheckPassword($this->input->post('password'), $u->password); 
if($check) /*logged in*/ 
else /*wrong credentials.*/ 

當你下載的文件Phpass它帶有一個test.php文件,演示的功能是如何工作的。我建議審查它。

+0

好的thx,看起來很棒,我會試試 – Necko

+0

因此,當我使用WP nammed PasswordHash的加密類時,我遇到了問題,返回的方案從不相同,所以如果返回的方案不可能匹配密碼當我應用算法時不一樣...某人有一個想法? – Necko

+0

對於像'test'這樣的密碼例子,當我使用WP的函數PasswordHash時,相關的加密語句永遠不會相同。 因此,無法檢查密碼是否與成員sql行中的方案匹配......這是正常的嗎? – Necko