Php 如何使用&;是否将Bcrypt输入数据库?

Php 如何使用&;是否将Bcrypt输入数据库?,php,bcrypt,Php,Bcrypt,所以我已经把这个问题读了好几遍,并且把所有的答案都读了一遍。我有一个半工作系统,但它坏了。对我来说,问题是这些帖子的答案通常给出了关于创建bcrtpt的长而复杂的代码,但是没有关于如何使用它的示例,即,响应第一个答案-- “您可以这样使用此代码: $bcrypt = new Bcrypt(15); $hash = $bcrypt->hash('password'); $isGood = $bcrypt->verify('password', $hash); " 我如何将一些表单数

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

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

$bcrypt = new Bcrypt(15);

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

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

此外,下面的解释会有所帮助-我有点不确定

  • 启动时Bcrypt函数中的15表示/表示什么?是指轮吗
  • 当执行$isGood“test”时,我假设$isGood被转换为布尔值(1=true),(0=false)。因此,您可以根据登录名是1还是0继续工作(或不工作),对吗
  • 我假设$hash是您要插入到数据库中的内容。如果是这样,为什么不能在登录时使用相同的哈希值,而使用$isGood thing?

我是php新手,以前使用过SHA($password)。。这很容易比较和创建,因此两者之间的任何关系(或与转换的链接?)对我或任何在相同情况下访问的人来说都是一个更容易理解的答案。

15意味着力量,而15则非常缓慢。

请确保正确使用此选项,否则,如果您太频繁地进行验证或散列,您将受到严重的性能损失。两个操作需要相同的时间完成。对您的具体场景执行
microtime()
15对性能不友好。

我通常使用7-10。更多是过度杀戮

PS:你会在
SO
上找到一些关于bcrypt的长篇帖子。读它们! 像这样:还是这样

PPS
本地测试:
15强度大约需要3秒。现在想象一下,在一个共享主机上:)你可能不会在1秒之内掉下来。我觉得太长了

实际代码

// 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;
记录在案。用于测试

只是不要设计代码来测试每个页面加载的哈希值。这将破坏你的网站的性能

  • 创建新用户或更改密码时进行哈希
  • 登录用户时进行验证
  • 在剩下的部分中,使用一些哈希机制,可以快速地在每个登录页面加载上进行测试
你会注意到你做错了。在站点的加载速度中:)

说明

// 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;
当你使用河豚地穴进行散列时,你需要一个盐、一个力量和一个密码。您可以根据规范要求将盐和强度结合起来,并创建一个兼容的盐。这个salt由
crypt()
翻译,并提取sale和strength,以及基于字符2和3的哈希算法

在数据库中,存储最终的哈希值。你不储存你用来散列密码的盐,因为你会破坏这个目的。hashcrypted值存储执行反向操作所需的内容,并检查您的普通密码是否与哈希密码匹配盐储存在中,您无需储存

当用户注册时,您可以散列密码并保存它。当他们登录时,您将根据他们在表单中提交的普通密码验证哈希密码。无需记住用于哈希的哈希这允许您在每次散列时生成随机散列,而无需关心该值是什么,因为它捆绑在返回的散列中。更多信息请参见


让我知道这是否有意义。

幻灯片:-视频:-看了之后,你应该知道并获得了代码的链接。@hakre-谢谢你的回答,但这更多的是对哈希的概述,然后才是实际使用bcrypt和交互/使用系统。你似乎对php没有基本的了解。我建议先学习一些php教程。另外,请查看php主页上的php手册,您可以在其中找到函数和类的API文档。@SamBowyer:您一定是在开玩笑吧:-从那次谈话中。如果你读过这篇演讲,你会发现这是在使用bcrypt。此外,您还可以获得与PHP的向上兼容性。您不能将这些函数的绝对值称为绝对行为。这些绝对值是相对于在其上运行的硬件的。正确的答案是在运行该应用程序的硬件上测试该应用程序。@hakre告诉他使用microtime()进行测试。15肯定在2500毫秒以上的范围内。好的。所以Bcrypt只是后面代码中使用的Bcrypt如何工作的一个定义。-您只需将密码替换为$user\u password,返回一个布尔值,然后运行它是否正确!还是没有?@Claudrian我已经测试了代码,是的,crypt是可用的,我看到它是如何工作的,如果验证,返回1。我现在要把它投入使用;感谢您的修订和示例代码,这使eaiser很容易理解+1&勾选d。