2013-06-06 105 views
0

我在玩幾個項目來學習MongoDB,我正在尋找的一件事是一個網站的身份驗證機制。MongoDB,PHP和身份驗證

當使用傳統的RDBMS時,您可以找到大量的庫來自動執行許多複雜的身份驗證,MongoDB中是否有某些內容?

我要麼尋找:

A)的東西是簡單和工程用了MongoDB的,或者 B)東西框,非常簡單,我可以扔掉它的密碼,並得到的理智的哈希出來了。

有沒有像那樣的東西?

注意:我不是在談論內置的MongoDB身份驗證。我的意思是我想在使用MongoDB作爲數據存儲的網站中構建一個身份驗證層。如果一切都失敗了,只要我有一些關於提取鹽析/散列的好東西,我就可以完成繁重的工作,所以我不必擔心它是否正確。

回答

1

PHP有你需要的散列函數。我更喜歡使用hash_pbkdf2(),但它只適用於後一版本的PHP。所以我經常使用標準化程度較低的crypt()函數。

它們的工作方式基本相同:您需要輸入密碼,算法和一些鹽,然後多次輸入密碼(數千)。輸出哈希包括走進它(算法,鹽和發),所以你可以當有人試圖登錄重新創建哈希額外的參數

兩種技術的優點是:

  • 你有你的散列算法
  • 加入隨機鹽的選擇使得字典攻擊更難
  • 散列的額外回合,使蠻力攻擊更難。

我寫了一個簡短的例子,用一個小單元測試。

/* Hashes a password using 2000 rounds of SHA-256 and a random salt. 
    Returns a string. 
*/ 
function hashpw($password) { 
    $algo = '$5$rounds=2000$'; // specify SHA-256 
    $salt = $algo . mt_rand(); 
    return crypt(strval($password), $salt); 
} 

/* Given a password and a hash produced by hashpw(), tells you if the hash 
    belongs to the password or not. 
    Returns a boolean. 
*/ 
function confirmpw($password, $hash) { 
    return (crypt(strval($password), strval($hash)) === $hash); 
} 

$passwords = array(
    'hello world', 
    'secret', 
    'super-secret', 
    'my pets name', 
); 

foreach($passwords as $onePass) { 
    $hash = hashpw($onePass); 
    $verified = confirmpw($onePass, $hash) ? 'verified' : 'failed' ; 

    echo "$onePass ==> $hash ==> $verified \n"; 
}