2012-09-19 45 views
2

我有一個本地服務器,它連接到我的在線數據庫。我一直在使用bitAuth作爲我的身份驗證方法,並且它工作得非常好,直到我將所有文件移動到我的服務器上。BitAuth Live服務器錯誤

BitAuth附帶默認管理員帳戶admin(pw admin)。我嘗試使用此登錄,但它返回「無效的用戶名/密碼」。

我看到別人提到過類似的問題here,但是沒有任何解決辦法。

+0

確保用戶屬於某些羣組..最近我在這方面遇到困難.. – Red

+0

是用戶確實屬於組「admin」:/ –

+0

刪除用戶認證..然後編輯用戶密碼。 。還要確保pswd是正確的,正如doc說的那樣。 – Red

回答

1

解決它自己:

我第一次被曝由BitAuth使用的密碼驗證過程。

這將使你這段代碼:

function CheckPassword($password, $stored_hash) 
{ 
    $hash = $this->crypt_private($password, $stored_hash); 
    if ($hash[0] == '*') 
     $hash = crypt($password, $stored_hash); 

    return $hash == $stored_hash; 
} 

如果你要打印$哈希值和$ stored_hash,你會認識到2個哈希值是不同的(如預期,因爲如果。它是相同的,那麼登錄會通過)

在這一點上,唯一可能的原因是crypt_private()函數產生了一個不同於存儲的散列的散列。然後我查看了crypt_private()函數:

function crypt_private($password, $setting) 
{ 
    $output = '*0'; 
    if (substr($setting, 0, 2) == $output) 
     $output = '*1'; 

    $id = substr($setting, 0, 3); 
    # We use "$P$", phpBB3 uses "$H$" for the same thing 
    if ($id != '$P$' && $id != '$H$') 
     return $output; 

    $count_log2 = strpos($this->itoa64, $setting[3]); 
    if ($count_log2 < 7 || $count_log2 > 30) 
     return $output; 

    $count = 1 << $count_log2; 

    $salt = substr($setting, 4, 8); 
    if (strlen($salt) != 8) 
     return $output; 

    # We're kind of forced to use MD5 here since it's the only 
    # cryptographic primitive available in all versions of PHP 
    # currently in use. To implement our own low-level crypto 
    # in PHP would result in much worse performance and 
    # consequently in lower iteration counts and hashes that are 
    # quicker to crack (by non-PHP code). 
    if (PHP_VERSION >= '5') { 
     $hash = md5($salt . $password, TRUE); 
     do { 
      $hash = md5($hash . $password, TRUE); 
     } while (--$count); 
    } else { 
     $hash = pack('H*', md5($salt . $password)); 
     do { 
      $hash = pack('H*', md5($hash . $password)); 
     } while (--$count); 
    } 

    $output = substr($setting, 0, 12); 
    $output .= $this->encode64($hash, 16); 

    return $output; 
} 

沒有什麼似乎不合適。然後,我發現PHP可能在不同版本中產生了不同的哈希值。然後我聯繫了我的服務器支持,發現服務器使用的是PHP5.2,而我的服務器使用的是PHP5.4。

solution很簡單,我添加以下行CI中我的.htaccess文件,

AddHandler的應用程序/ x-的httpd-php53 .PHP

這在我的服務器,將啓用PHP5.3而不是PHP5.2。這已經使得crypt_private()函數從所提供的密碼字符串和所存儲的散列產生相同的散列。

此問題的另一個解決方案是,基本上只需創建一個新帳戶,進入您的數據庫並「激活」帳戶。由於這個新的散列是由您的服務器使用的任何版本的PHP生成的,因此它解決了這個問題。

我希望我提供的2個解決方案能夠幫助那些面臨同樣問題的其他BitAuth用戶。

BitAuth是一個很好的身份驗證庫,只要他們將它放到他們的文檔中,以使用戶意識到這個潛在的錯誤。

美好的一天。