所以我几次阅读了这个问题here并阅读了所有答案。我有一个半工作系统,但崩溃了。对我来说问题是这些帖子的答案通常会给创建bcrtpt提供冗长而复杂的代码 - 但是没有关于如何使用它的例子,即回应第一个答案 -
“您可以使用此代码:
$bcrypt = new Bcrypt(15);
$hash = $bcrypt->hash('password');
$isGood = $bcrypt->verify('password', $hash);
“
我如何在代码中输入一些表单数据(让我们称之为$ user_password)来创建一个新的bcrypt来放入数据?
此外,对以下内容的解释会有所帮助 - 我有点不确定。
我对php很新,并且以前一直使用SHA($ password)..这很容易比较和创建,所以两者之间的任何关系(或链接转换?)会产生更多对于我或在相同情况下访问的任何其他人来说,这是可以理解的答案。
答案 0 :(得分:1)
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;
记录在案。用于测试。
只是不要设计代码来测试每个页面加载的哈希值。这将会破坏您网站的效果。
当你做错时,你会注意到。在您网站的加载速度:)
<强>说明强>:
当您使用blowfish crypt进行哈希时,您需要一个salt,一个力量和一个密码。您可以根据规范要求将盐和强度结合起来,然后创建crypt()
兼容盐。此盐由crypt()
翻译,并提取销售和强度,以及基于字符2和3的散列算法。
在数据库中,存储最终的哈希值。您不会存储用于散列密码的盐,因为您将失去目的。 hashcrypted值存储执行反向操作所需的内容,并检查您的普通密码是否与散列密码匹配。 盐存储在中,无需存储。
用户注册后,您将密码并保存。当他们登录时,您将根据他们在表单中提交的普通密码验证散列密码。无需记住用于散列的哈希。 这允许您在每次散列时生成随机哈希,而无需关心返回哈希中捆绑的值。有关详情,请参阅crypt() page on php.net。
让我知道这是否有意义。