2012-07-18 50 views
0

我试图过渡到Blowfish认证系统。忍受我,我不是密码学家,我对Blowfish的理解还没有完成。Bycript /河豚和盐与现有的认证系统

当前设置使用sha1和盐。盐为每个用户生成并存储在数据库中。它归结为:

$salt = $this->getSalt($username); 
$hash = sha1($password . $salt); 
if ($hash == $hashInDB) 
{ 
    // user is authenticated, set session id etc ... 
} 

getSalt()方法获取存储在数据库中指定用户的盐。

现在,如果我理解正确的一切,隐窝我应该做的事情:

$salt = '$2a$07$' . $this->getSalt($username) . '$'; 
$hash = crypt($password, $salt); 

if ($hash == crypt($password, $saltInDB)) 
{ 
    // The user is authenticated, set session id etc.. 
} 

为了澄清,对第二个例子中$saltInDB变量,就像是'“$ 2A $ $ 07 arandomsaltcreatedatregistration $”的值。

  • 我在做对吧?

回答

0

你的例子几乎是正确的。

当创建与crypt()函数的散列,你将看到的是,所使用的参数(算法,成本和盐)是所生成的散列的一部分(散列的开始):

$2a$07$LCzy1mE0b9lS8Uyx9HEeUgHm8zH1iDDZ5... 

即意思是说,你可以用$hashInDB代替$saltInDB,crypt()函数将从$hashInDB自动提取所需的参数。这也回答了你关于存储盐的问题,只是将散列值存储在数据库中,盐就包含在那里。是的,你应该为每个密码生成一个新盐。

盐之后的'$'是不需要的。有关如何生成一个bcrypt哈希你可以找到here,如果你正在寻找一个完善的图书馆

更多的信息,我可以推荐phpass