Запрос API хеширования паролей

Итак, я использую новый PHP 5.5 Password Hashing API, и я не уверен, правильно ли я это понял.

Я пытался автоматически перехешировать каждый логин, и иногда у меня ничего не получалось, даже когда хеширование все равно оказывается одинаковым, я чувствую, что делаю что-то не так.

Это может быть функция запроса, в которой я, вероятно, ошибся, потому что хэши даже не меняются, когда я проверяю phpMyAdmin.

if (password_needs_rehash($result_row->user_password_hash, PASSWORD_DEFAULT))
{
    $newhash = password_hash(
        $_POST['user_password'], PASSWORD_BCRYPT, 
        ['cost' => 12, 'salt' => 'superfreakingsonicdude',]
    );

    // update hash in database
    $this->connection->query(
        "UPDATE users SET user_password_hash='" . $newhash .  
        "' WHERE user_name='".$result_row->user_name."'"
    );
}

Здесь вы можете найти все функции.


person Satan    schedule 13.02.2013    source источник
comment
Насколько я могу судить, вы проверяете, хэширован ли он с помощью PASSWORD_DEFAULT, и если нет, вы сохраняете хэш с помощью PASSWORD_BCRYPT. Если они не совпадают (например, если в более новой версии PHP PASSWORD_DEFAULT установлено на PASSWORD_ROT13), вы всегда будете повторно хэшировать пароль, поскольку он никогда не хэшировался с использованием PASSWORD_DEFAULT.   -  person Joachim Isaksson    schedule 13.02.2013
comment
(короче говоря, используйте PASSWORD_DEFAULT или PASSWORD_BCRYPT, не смешивайте их)   -  person Joachim Isaksson    schedule 13.02.2013
comment
Я понял, что исходный хэш был BCRYPT, поэтому мне нужно установить его. Основная проблема в том, что хэш не меняется независимо.   -  person Satan    schedule 13.02.2013
comment
Почему вы определяете свою собственную соль? Вы должны использовать сгенерированную соль вместо слабой соли, которая у вас есть.   -  person Ja͢ck    schedule 13.02.2013
comment
Кстати, что значит иногда я терплю неудачу?   -  person Ja͢ck    schedule 13.02.2013
comment
Это не для коммерческого использования, поэтому я не делаю важную соль. Это в моем проекте Github. То, что я сказал, было искажением.   -  person Satan    schedule 13.02.2013
comment
@TerryCampbell, неважно, для коммерческого использования или нет. Не передавайте статическую соль. Всегда. Пусть он сгенерирует для вас случайный, не передавайте параметр соли. Кроме того, не меняйте хеш при каждом входе в систему, это просто плохо. Меняйте его, когда меняете алгоритм или стоимость, или когда пользователь меняет свой пароль. Но нет причин менять его при каждом входе в систему...   -  person ircmaxell    schedule 13.02.2013
comment
См. также фреймворк хеширования паролей PHP (PHPass) Openwall. Он портативный и защищен от ряда распространенных атак на пароли пользователей.   -  person jww    schedule 12.10.2014


Ответы (2)


Добавлена ​​функция password_needs_rehash для проверки необходимости обновления:

password_needs_rehash($result_row->user_password_hash, PASSWORD_DEFAULT)

Эта функция проверяет, реализует ли предоставленный хэш предоставленный алгоритм и параметры. Если нет, предполагается, что хэш необходимо перефразировать.

Если у вас есть проблемы с пониманием того, что делает эта функция, RFC содержит функцию в коде PHP. Поэтому, если вы умеете читать PHP-код, вы сможете прочитать следующее (см. часть, представленную как Это может быть реализовано на уровне пользователя:): https://wiki.php.net/rfc/password_hash#password_needs_rehash

Имеет смысл проверить, соответствует ли хэш в базе (хранилище) тому же алгоритму, что и в PASSWORD_DEFAULT, или нет. Это означает проверить, был ли изменен PASSWORD_DEFAULT между временем сохранения хэша в прошлый раз и сейчас.

Прямо сейчас PASSWORD_DEFAULT равно PASSWORD_BCRYPT, поэтому он всегда должен возвращать false. В вашем случае он возвращает true, потому что вы тестируете без параметров пароля.

Измените это, и все будет в порядке:

$options = ['cost' => 12, 'salt' => 'superfreakingsonicdude',];
########

if (password_needs_rehash($result_row->user_password_hash, PASSWORD_DEFAULT, $options))
                                                                             ########
{
    $newhash = password_hash($_POST['user_password'], PASSWORD_DEFAULT, $options);
                                                      ################  ########

    // update hash in database
    $this->connection->query(
        "UPDATE users SET user_password_hash='" . $newhash .
            "' WHERE user_name='".$result_row->user_name."'"
    );
}

Также подумайте о том, чтобы продолжать использовать PASSWORD_DEFAULT, если вы хотите получить выгоду от обновления алгоритма хеширования по умолчанию в ядре PHP.

person hakre    schedule 13.02.2013
comment
user_password_hash по-прежнему не меняется. Если только ... требуется ли генерация соли, чтобы функция перефразирования реагировала? - person Satan; 13.02.2013
comment
Возвращаемое значение user_password_hash() не изменится, если вы не изменили (по крайней мере один из) этих трех параметров: 1.) простой (пароль), 2.) алгоритм конкретный (PASSWORD_DEFAULT не является конкретным со временем) и 3.) варианты. Если ни одно из этих изменений не изменится, хеш будет таким же (кстати, это особая природа хеш-функции). - person hakre; 13.02.2013
comment
Ах хорошо! Я больше надеялся, что весь хэш будет меняться каждый раз, когда человек входит в систему, пока его все еще можно прочитать, но я предполагаю, что это не имеет никакого смысла. - person Satan; 13.02.2013

Ввод в хеш — это пароль и соль. Тот же пароль, та же соль, тот же результат.
Если вы не укажете параметр salt, каждый раз будет генерироваться случайная соль, и вы должны получить другой результат. Вы не должны предоставлять статическую соль. Это означает, что у всех пользователей одна и та же соль, что значительно снижает ее эффективность. Каждый отдельный хэш needs должен иметь случайную соль.

person deceze♦    schedule 13.02.2013
comment
Но проблема в том, что я вообще не получаю другое поколение, когда пытаюсь запросить перефразировку. - person Satan; 13.02.2013
comment
Ссылка: здесь вы можно найти все функции. - person Satan; 13.02.2013