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