2013-08-19 98 views
0

這存儲在數據庫中。如何將此演示密碼發送給我的用戶?我不能將這個($ 2y $ 10 $ Zjk5YzQ4ZTlhMzNlNTUzMO3Wnm1FqXmAb6/4DmyptNGoEdWGLwls。)轉換爲普通文本。使用blowfish發送忘記密碼的電子郵件

有沒有解決方法?我也無法發送隨機密碼。

demo = $2y$10$Zjk5YzQ4ZTlhMzNlNTUzMO3Wnm1FqXmAb6/4DmyptNGoEdWGLwls. 

這裏有一些功能我用密碼檢查和生成:

function password_encrypt($password) { 
    $hash_format = "$2y$10$"; // Tells PHP to use Blowfish with a "cost" of 10 
    $salt_length = 22;     // Blowfish salts should be 22-characters or more 
    $salt = generate_salt($salt_length); 
    $format_and_salt = $hash_format . $salt; 
    $hash = crypt($password, $format_and_salt); 
    return $hash; 
} 

function generate_salt($length) { 
    // Not 100% unique, not 100% random, but good enough for a salt 
    // MD5 returns 32 characters 
    $unique_random_string = md5(uniqid(mt_rand(), true)); 
    // Valid characters for a salt are [a-zA-Z0-9./] 
    $base64_string = base64_encode($unique_random_string); 
    // But not '+' which is valid in base64 encoding 
    $modified_base64_string = str_replace('+', '.', $base64_string); 
    // Truncate string to the correct length 
    $salt = substr($modified_base64_string, 0, $length); 
    return $salt; 
} 

function password_check($password, $existing_hash) { 
    // existing hash contains format and salt at start 
    $hash = crypt($password, $existing_hash); 
    if ($hash === $existing_hash) { 
    return true; 
    } else { 
    return false; 
    } 
} 
+1

我沒有看到你問的實際問題。 「演示密碼」是什麼意思? –

+1

如果用戶忘記了自己的密碼,那麼他們應該被髮送一個鏈接,其中包含一個隨機生成的令牌(限定時間和僅限一次使用),可用於獲取可以設置新密碼的表單。您不應該將散列的密碼發送給用戶。 – Quentin

+0

但這是blowfish –

回答

0

這不是密碼恢復的好方案,生成一個新的密碼,並將其發送給用戶。而是向用戶發送帶有隨機獨立代碼的鏈接,並將此代碼存儲在數據庫中(散列)。當用戶點擊鏈接時,讓他輸入一個新的密碼。然後,不需要知道舊密碼,當用戶可以閱讀電子郵件時(他的電子郵件地址),用戶就被認證。

忘記了密碼的形式,人人都可以發佈:你會不會很高興,如果有人進入你的電子郵件和密碼立即修改。檢索鏈接後,您有機會忽略電子郵件,或者確認您確實想要更改密碼。

正如你正確地指出,密碼應被存儲爲哈希值,因此無法檢索。只要密碼的散列存儲在數據庫中,就不需要進一步知道真實密碼。每當你需要密碼時,你就會知道它,因爲用戶輸入了密碼。

要生成BCrypt哈希,我建議使用PHP函數password_hash(),對於早期的PHP版本,也存在compatibility pack。特別是鹽的生成在那裏得到了更好的解決。

P.S. 您描述的散列稱爲BCrypt,它基於用於雙向加密的blowfish密碼。

相關問題