15 表示强度,15 表示非常缓慢。
确保您正确使用此功能,否则如果您过于频繁地进行验证或散列,您将受到严重的性能损失。这两个操作需要相同的时间才能完成。microtime()
对你的确切情况做一个。15 对性能不友好。
我通常使用 7 - 10。更多是矫枉过正...
PS:你会在这里找到一些SO
关于bcrypt的冗长帖子。阅读它们!像这样:https ://security.stackexchange.com/questions/4781/do-any-security-experts-recommend-bcrypt-for-password-storage或者这个http://michaelwright.me/php-password-storage
PPS:Local test:
15强度大约需要3秒。现在想象一下在共享主机上:) 你可能不会低于 1 秒。IMO太长了。
实际代码:
// Is it available on this system?
$Availability = function_exists('crypt') and defined('CRYPT_BLOWFISH');
// And now the code:
$MT = microtime(true); // Time things, so we can get scared
$Password = 'somepassword'; // The password
$Salt = 'addsomevalidsalthere'; // Your salt, must be valid, read docs
$Strength = 15; // Strength (1-99)
// Compute the formatted salt required for crypt
$CryptSalt = sprintf('$2a$%02d$%s$', $Strength, $Salt);
// Hash the use $Password for storage
$Hashed = crypt($Password, $CryptSalt);
// Verify it against the user input $Password
$Verified = crypt($Password, $Hashed) === $Hashed;
// Show the duration of this (2x as it's both in and out)
echo number_format(microtime(true) - $MT, 6), PHP_EOL;
它已记录在案。用于测试。
只是不要设计您的代码来测试每个页面加载时的哈希值。这将扼杀您网站的性能。
- 创建新用户或更改密码时的哈希。
- 登录用户时进行验证。
- 其余的,使用一些散列机制来快速测试每个登录页面的加载。
当你做错了,你会注意到。在您网站的加载速度中:)
解释:
当你用河豚地穴散列时,你需要一个盐、一个强度和一个密码。您可以按照规格要求将盐和强度结合起来,并创建一种crypt()
兼容的盐。这个盐被翻译crypt()
并提取了销售和强度,加上基于字符 2 和 3 的散列算法。
在您的数据库中,您存储最终的哈希值。您不会存储用于散列密码的盐,因为您将无法达到目的。hashcrypted 值存储执行反向操作所需的内容,并检查您的纯密码是否与散列密码匹配。盐存储在 内,无需您存储。
用户注册后,您对密码进行哈希处理并保存。当他们登录时,您会根据他们在您的表单中提交的普通密码验证散列密码。无需记住用于散列的散列。这允许您在每个散列上生成随机散列,而无需关心该值是什么,因为它捆绑在返回的散列中。在 php.net 上的crypt () 页面上查看更多信息。
让我知道这是否有意义。