2013-07-18 51 views
0

我发现这个例子如何散列和检查密码与PHP。这是安全的吗?这是一个很好的例子来模仿?PHP:这个密码加密是否安全?

public function hashPassword($mail, $password, $salt, $rounds='08') 
{ 
    $length = strlen($password) * 4; 
    $data = str_pad($password, $length, sha1($mail), STR_PAD_BOTH); 
    $string = hash_hmac('whirlpool', $data, SERVER_KEY, true); 

    return crypt($string, '$2a$' . $rounds . '$' . $salt); 
} 

public static function checkPassword($mail, $password, $stored) 
{ 
    $length = strlen($password) * 4; 
    $data = str_pad($password, $length, sha1($mail), STR_PAD_BOTH); 
    $string = hash_hmac ('whirlpool', $data, SERVER_KEY, true); 

    return (crypt($string, substr($stored, 0, 30)) === $stored); 
} 
+0

哦,请不要称之为解密密码,你会开始“愤怒”。无论如何,为什么使用比bcrypt/scrypt/ppbkdf2还要多的东西呢? – JimL

+0

好吧,你是对的。这不是一个解密功能。 – Pascal

+0

其实它也不是加密的,漩涡是一个哈希算法:P现在我只是觉得自己像一个混蛋o我还是推荐一个可靠的,经过验证的例程,比如bcrypt或者pbkdf2 – JimL

回答

2

散列算法看起来比其实没什么问题其他您所使用$2a$代替$2y$。从crypt() man page

开发商只针对PHP 5.3.7后来由于成本参数是非常优先应该用 “$ 2Y $” 到 “$ 2A $”

此外,使用08除非你使用的是非常旧的硬件,否则会变弱您希望尽可能长时间地散列,而不会给用户造成不便。通常250毫秒是可以接受的。在我的台式电脑(这不是现代的),这相当于11,所以对于一个体面的服务器,你可能至少需要这么多。尝试使用该参数,直到获得一个需要花费这么长时间的数字来计算/验证散列并使用它。

另一个相当大的问题是如何生成盐,但由于我们没有看到你是如何做到这一点的,所以没有太多可以批评的东西。

尽管如此,迄今为止最好的做法是忘记制作一个家庭酿造密码散列算法,而是使用内置于PHP的password_hash()函数。 (对于PHP < 5.5,您可以从github下载兼容包)。