php – crypt和密码存储问题
相关问题:
Am I using PHP’s crypt() function correctly? Password storage hash with SHA-512 or crypt() with blowfish (bcrypt) 我试图找出如何使用PHP安全地存储密码.稍微阅读后我发现我应该使用crypt()而不是hash(),并且我应该使用blowfish(bcrypt)或SHA-512算法,我相信bcrypt会被更频繁地推荐,尽管有很多也支持基于SHA-512的算法. 还有很多建议我的盐应该尽可能随机,有很多建议在核心rand()和mt_rand()上使用openssl_random_pseudo_bytes(). 我的主要问题是: >如果我选择使用bcrypt,我应该考虑使用哪些负载因子?我注意到对于PHP 5.5,新密码API中的默认加载因子是10,所以我想我至少想要这个值. _ function gen_salt($cost) { return "$2y$" . $cost . "$" . str_replace('+','.',base64_encode(openssl_random_pseudo_bytes(22))); } 解决方法
因此,根据评论,我创建了一个简单的基准测试来测试各种散列方法需要多长时间.
function bcrypt_salt($cost) { return "$2y$" . $cost . "$" . str_replace('+',base64_encode(openssl_random_pseudo_bytes(22))) . '$'; } function sha512_salt($cost) { return "$6$rounds=" . $cost . "$" . openssl_random_pseudo_bytes(16) . '$'; } $password = "stackoverflow"; $times = 1; echo "<p>bcrypt method</p>"; for($iters = 10; $iters < 15; ++$iters) { $salt = bcrypt_salt(strval($iters)); $pword_crypt = crypt($password,$salt); $start_time = microtime(true); for($i = 0; $i < $times; ++$i) { crypt($password,$pword_crypt); } $end_time = microtime(true); echo "<p> cost = $iters: " . ($end_time - $start_time) . "</p>"; } echo "<p>SHA512 method</p>"; for($iters = 1024; $iters < 1000000; $iters *= 2) { $salt = sha512_salt(strval($iters)); $pword_crypt = crypt($password,$pword_crypt); } $end_time = microtime(true); echo "<p> log2(iters) = ". log($iters,2) . ": " . ($end_time - $start_time) . "</p>"; } 基准测试结果(以秒为单位的时间): 使用i5-m430跑在我的笔记本电脑上:
在所有条件相同的情况下,SHA-512方法与bcrypt相比需要更多的迭代次数才能占用相同的时间.话虽这么说,我猜测任何至少需要十分之一秒的方法绰绰有余. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |