如何使用&将Bcrypt输入数据库?

时间:2012-11-01 18:59:32

标签: php bcrypt

所以我几次阅读了这个问题here并阅读了所有答案。我有一个半工作系统,但崩溃了。对我来说问题是这些帖子的答案通常会给创建bcrtpt提供冗长而复杂的代码 - 但是没有关于如何使用它的例子,即回应第一个答案 -

“您可以使用此代码:

$bcrypt = new Bcrypt(15);

$hash = $bcrypt->hash('password');
$isGood = $bcrypt->verify('password', $hash);

我如何在代码中输入一些表单数据(让我们称之为$ user_password)来创建一个新的bcrypt来放入数据?

此外,对以下内容的解释会有所帮助 - 我有点不确定。

  • 开始时Bcrypt函数中的15是什么意思/做什么?这是不是意味着轮次?
  • 当执行$ isGood'test'时,我假设$ isGood变为布尔值(1 =真),(0 =假)。所以你可以根据它是1还是0继续工作(或不工作),对吧?
  • 我假设$ hash是您插入数据库的内容。如果是这样,为什么你不能在登录时使用相同的哈希,而不是使用$ isGood的东西呢?

我对php很新,并且以前一直使用SHA($ password)..这很容易比较和创建,所以两者之间的任何关系(或链接转换?)会产生更多对于我或在相同情况下访问的任何其他人来说,这是可以理解的答案。

1 个答案:

答案 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

让我知道这是否有意义。