Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于Ruby on Rails的PHP BCrypt设计密码_Php_Ruby On Rails_Bcrypt - Fatal编程技术网

用于Ruby on Rails的PHP BCrypt设计密码

用于Ruby on Rails的PHP BCrypt设计密码,php,ruby-on-rails,bcrypt,Php,Ruby On Rails,Bcrypt,我试图用PHP验证Desive Ruby on Rails生成的一些密码。 Desive已配置为使用bcrypt 我的代码是: $database_record = "$2a$10$..."; // generated by devise $user_input = 'asdasd'; $password = crypt($user_input, '$2a$10$usesomesillystringforsalt$'); if (crypt($user_input, $database_rec

我试图用PHP验证Desive Ruby on Rails生成的一些密码。 Desive已配置为使用bcrypt

我的代码是:

$database_record = "$2a$10$..."; // generated by devise
$user_input = 'asdasd';
$password = crypt($user_input, '$2a$10$usesomesillystringforsalt$');

if (crypt($user_input, $database_record) == $password) {
    echo "<br/>Password verified!";
}
else {
    echo '<br/>failed!'; }
$database_record=“$2a$10$…”;//由设计产生
$user_input='asdasd';
$password=crypt($user_input,$2a$10$usesomesillystringforsalt$);
if(crypt($user\u input,$database\u record)==$password){
echo“
密码已验证!”; } 否则{ 回显“
失败!”;}
我看到的文档正在使用这种方法,但它不适合我。我忘了什么吗? “胡椒串”应该以任何方式使用吗?
谢谢

我对这部分感到困惑

$password = crypt($user_input, '$2a$10$usesomesillystringforsalt$');
我认为您被文档后面的部分弄糊涂了,该部分指定了如何创建哈希并保证它是bcrypt。在您的情况下,您正在验证一个哈希,因此它将自动执行该操作

您要做的是跳过该操作,然后执行以下操作:

if (crypt($user_input, $database_record) == $database_record) {

因此,如果这是我期望的结果,
crypt($user\u input,$database\u record)
将从
$database\u record
中取出盐,并使用它在
$user\u input
上运行bcrypt。然后您想再次将结果与
$database\u record
进行比较,因为它是正确密码的bcrypt散列。

我终于找到了解决方法。Desive在密码末尾添加胡椒,然后执行加密

工作守则是:

if (crypt($passwordToValidate.$pepper, $encryptedPassword) == $encryptedPassword)
   echo 'ok!';
else
   echo 'failed!';
使用PHP5>=5.5.0

$pepper = 'xxxyyyzzz'; //get value from config/initializers/devise.rb
$password = '12345678'; //clear password to validate

$db_pass = '***************************'; //password stored on database

$options = [
    'salt' => substr($db_pass,7)
];

$ok = ($db_pass == password_hash($password.$pepper, PASSWORD_BCRYPT, $options));

我遇到了一个问题,php生成了$2y……,但ruby生成了$2a。。。。。
更多信息

你好,布伦丹!谢谢你的回答。你说的有道理。但是我试过了,仍然有同样的问题。。。我想也许我遗漏了一些额外的设计编码。我终于发现了如何解决这个问题。您的解决方案是正确的,我只需要将密码和pepper结合起来,并对两者进行加密。再次感谢@Andrés当某人的答案有帮助时,你可以在他们答案旁边的向上箭头上做标记。如果答案解决了您的问题,您可以单击复选框。这有助于其他可能有类似问题的人(因为最好的答案在页面顶部),并通过奖励帮助过你的人来帮助网站。嗨,Brendan,再次感谢。我想给你的答案打个肯定的分数,但我的声誉只有11分,我知道我只有15分才能得分。当我找到他们时,我会给你指出你应得的:)@Andrés既然你问了这个问题,你就可以把答案标记为正确(复选标记)。