3

我正在尝试使用 PHP 验证 Devise Ruby on Rails 生成的一些密码。设计被配置为使用 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!'; }

我看到的文档正在使用这种方法,但它对我不起作用。我是不是忘记了什么?“胡椒串”应该以任何方式使用?谢谢!

4

4 回答 4

3

我对这部分感到困惑。

$password = crypt($user_input, '$2a$10$usesomesillystringforsalt$');

我认为您对文档的后面部分感到困惑,该部分指定了如何创建哈希并保证它是 bcrypt。在您的情况下,您正在验证哈希,因此它会自动执行此操作。

你想要做的是跳过它并做:

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

因此,如果这按我的预期工作,crypt($user_input, $database_record)将从中获取盐$database_record并使用它来运行 bcrypt on $user_input。然后你想再次比较结果,$database_record因为它是正确密码的 bcrypt 哈希。

于 2012-07-18T15:21:57.467 回答
2

使用 PHP 5 >= 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));
于 2014-07-16T15:16:19.803 回答
1

我终于发现了如何解决这个问题。设计在密码末尾添加胡椒,然后执行加密。

工作代码是:

if (crypt($passwordToValidate.$pepper, $encryptedPassword) == $encryptedPassword)
   echo 'ok!';
else
   echo 'failed!';
于 2012-07-19T14:04:44.773 回答
0

我遇到了一个问题,即 php 生成的密钥像 $2y ......,但是 ruby​​ $2a ..... 更多在这里https://github.com/ircmaxell/password_compat/issues/49

于 2016-09-09T00:47:10.603 回答