2014-05-07 206 views
0

我目前正在使用「密碼」功能在客戶端將密碼存儲在MySQL數據庫中的網站上工作。PHPMyAdmin數據庫之間的密碼加密

新數據庫將使用MD5和Salt的組合存儲加密密碼。

因此,我使用加密密碼將現有用戶複製到了我們的數據庫,但是當運行密碼功能來檢查登錄時,它總是返回不正確的密碼。當我檢查正確密碼的密碼功能的結果時,它會產生與存儲的結果不同的結果。

我需要做一些額外的工作才能使加密匹配併產生相同的結果嗎?我必須直接從客戶網站訪問密碼嗎? (因爲我已將用戶表複製到我們的本地數據庫)

回答

0

爲了從加密中獲得相同的結果,必須在比較散列值之前使用相同的機制進行加密。

如果您已經創建了密碼功能的原始密碼哈希值,哈希看起來像這樣(爲PASSWORD函數的當前版本

*196BDEDE2AE4F84CA44C47D54D78478C7E2BD7B7 

或類似這樣的,如果與OLD_PASSWORD函數創建(前MySQL 4.1中...)

29bad1457ee5e49e 

直的方法來處理這個是讓你的認證查詢這個樣子

select count(*) as authfield from your_auth_table 
    where username = 'typed-in-username' 
    and 
    (
     password = password('typed-in-password') 
     or password = old_password('typed-in-password') 
    ) 

如果用戶名和密碼匹配,這將產生authfield = 1

如果你想自己做加密在PHP中,記者到MySQL密碼algorythm是這樣的:

$passwordnew = '*'. strtoupper(sha1(hextostr(sha1('pass')))); 


    function hextostr($hex) 
    { 
     $str=''; 
     for ($i=0; $i < strlen($hex)-1; $i+=2) 
     { 
      $str .= chr(hexdec($hex[$i].$hex[$i+1])); 
     } 
     return $str; 
    } 

對於您可以使用的old_password功能

$passwordold = old_password('pass'); 

function old_password($password) { 
    if ($password == '') 
     return ''; 
    $nr = 1345345333; 
    $add = 7; 
    $nr2 = 0x12345671; 
    foreach(str_split($password) as $c) { 
     if ($c == ' ' or $c == "\t") 
     continue; 
     $tmp = ord($c); 
     $nr ^= ((($nr & 63) + $add) * $tmp) + ($nr << 8); 
     $nr2 += ($nr2 << 8)^$nr; 
     $add += $tmp; 
    } 

    if ($nr2 > PHP_INT_MAX) 
     $nr2 += PHP_INT_MAX + 1; 

    return sprintf("%x%x", $nr, $nr2); 
}