2012-07-31 108 views
0

我已經採取了以下功能從Internet bcrypt。它輸出一個加密的密碼,這正是我正在尋找的。我還採用了使用鹽進行檢查的功能,但是此功能不提供給我鹽。PHP bcrypt哈希存儲鹽

function bcrypt_hash($password, $work_factor = 8) 
{ 
    if (version_compare(PHP_VERSION, '5.3') < 0) throw new Exception('Bcrypt requires PHP 5.3 or above'); 

    if (! function_exists('openssl_random_pseudo_bytes')) { 
     throw new Exception('Bcrypt requires openssl PHP extension'); 
    } 

    if ($work_factor < 4 || $work_factor > 31) $work_factor = 8; 
    $salt = 
     '$2a$' . str_pad($work_factor, 2, '0', STR_PAD_LEFT) . '$' . 
     substr(
      strtr(base64_encode(openssl_random_pseudo_bytes(16)), '+', '.'), 
      0, 22 
     ) 
    ; 
    return crypt($password, $salt); 
} 

我需要分別返回密碼和鹽。或者是否有辦法將它們分別從這個功能中拉出來。

+1

爲什麼你需要他們分開?您仍然可以將它們串聯在一個字符串中。在這種情況下,總是第一個或最後一個X字符是鹽。不需要多個DB字段或函數返回值。 – feeela 2012-07-31 16:53:17

+0

@feeela有趣的告訴我更多。如果這就是密碼字段所需的全部內容,那麼我們在用戶登錄時如何檢查它。 – 2012-07-31 16:56:44

+0

我已經在snipplr上發佈了這樣的函數;我想你會明白:http://snipplr.com/view/66454/passwordhash--generate-salted-passwords/ – feeela 2012-08-01 09:13:35

回答

2

你不能從一個函數返回多個值,但你可以返回一個數據結構,其中包含多個值:

return array('crypt' => crypt($password, $salt), 'salt' => $salt);