这是将密码存储在数据库中并激活用户帐户的正确方法吗?

时间:2013-09-08 10:26:21

标签: php mysql passwords salt crypt

我正在建立一个包含HTML5,CSS,JavaScript,PHP和MySQL数据库的网站。我创建了一个登录页面和一个“创建新用户页面”,并希望发送一封电子邮件来激活用户帐户。我现在建立的是工作,但我想验证我做得足够安全。

创建用户帐户时,我使用以下代码:

$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字段并设置标志以显示用户已激活,然后将用户重定向到激活页面。

很想听听你对此的看法。

Gabrie

1 个答案:

答案 0 :(得分:0)

不,你不应该做什么,crypt()的参数需要一定的格式,否则你将无法获得BCrypt值,盐也不安全。在PHP 5.5中有一个名为password_hash()的函数可以完全解决您的问题,因为早期版本存在来自同一作者的compatibilty pack,使用此函数是“未来证明”。

最好不要从其他参数中获取激活密钥,只需生成随机令牌并将此令牌发送给用户即可。在数据库中,您只存储此令牌的哈希值。该系统也可用于生成密码重置链接。您可以找到此类令牌的示例实现here