-1

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

“您可以这样使用此代码:

$bcrypt = new Bcrypt(15);

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

"

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

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

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

我对 php 很陌生,以前一直在使用 SHA($password) .. 这很容易比较和创建,所以两者之间的任何关系(或链接到转换?)都会为我或任何其他在相同情况下访问的人。

4

1 回答 1

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

PPSLocal 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 () 页面上查看更多信息。

让我知道这是否有意义。

于 2012-11-01T19:15:21.743 回答