簡體   English   中英

這是將密碼存儲在數據庫中並激活用戶帳戶的正確方法嗎?

[英]Is this the right way to store passwords in database and activate user accounts?

我正在用HTML5,CSS,JavaScript,PHP和MySQL DB建立一個網站。 我已經創建了一個登錄頁面和一個“創建新用戶頁面”,並希望發送一封電子郵件以激活該用戶帳戶。 我現在構建的文件正在運行,但我想驗證自己是否足夠安全。

創建用戶帳戶時,我使用以下代碼:

$Allowed_Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
$Chars_Len = 63;
$Blowfish_Pre = 'xxxxxxxxxxx';   <- not sure if that is something I can share with anyone
$Blowfish_End = 'xxxxxxxxxxx';   <- not sure if that is something I can share with anyone

$Salt_Length = 21;
$mysql_date = date( 'Y-m-d' );
$salt = "";
for($i=0; $i<$Salt_Length; $i++)
{
    $salt .= $Allowed_Chars[mt_rand(0,$Chars_Len)];
}
$bcrypt_salt = $Blowfish_Pre . $salt . $Blowfish_End;
$hashed_password = crypt($password, $bcrypt_salt);
$activationkey = crypt( $hashed_password . $uname);

(我使用hash_pass + uname為$ activationKey創建一個新的哈希,不添加鹽。)

然后在數據庫中存儲:uname,hashed_pa​​ssword,salt,activationkey,然后設置一個標志,表明該帳戶未激活。

然后,我將包含激活碼的電子郵件發送給用戶。

當用戶單擊鏈接時,我將搜索電子郵件地址和激活密鑰。 如果找到,則清除數據庫中的activationkey字段,並設置標志以顯示用戶已被激活,然后將用戶重定向到激活頁面。

很想聽聽您對此的想法。

加布里

不,那不是您應該做的,crypt()的參數需要某種格式,否則您將不會獲得BCrypt值,並且salt將會不安全。 在PHP 5.5中,有一個名為password_hash()的函數可以完全解決您的問題,對於較早的版本,存在來自同一作者的兼容性包 ,使用此函數是“面向未來的”。

激活密鑰最好不要從其他參數派生,而只是生成一個隨機令牌並將此令牌發送給用戶。 在數據庫中,您僅存儲此令牌的哈希。 該系統也可用於生成密碼重置鏈接。 您可以在此處找到此類令牌的示例實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM