Поведение PHP password_hash()

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

Я использую двусторонние соли, поэтому уникальную соль, которая есть у каждого пользователя, а затем, очевидно, соль, хранящуюся в моем приложении, я заметил довольно странное поведение... и согласно документации PHP это поведение нормально?

Во всяком случае, вот код, который я использую:

$Crypto = new Crypto;
echo $Crypto->encrypt( "123456789abcdefghijklm", "StackOverflow_Is_Awesome!" ); // First parameter being the "User Salt", second being the password.

// Above outputs $2y$13$123456789abcdefghijkleepFY8JLvsf2YbnWolqQyO3DIzrCeNIu

А теперь класс Crypto:

<?php
// ASSUMING $this->hashingSalt = HBSNi3y7ruhbVGkhdg83ijdbvghiojkgudL;JP
class Crypto {

private $hashingSalt, $database;

public function __construct( $salt )
{
    $this->hashingSalt = $salt;
    $this->database = new DatabaseFunctions();
}

public function encrypt( $salt, $password )
{
    $options = array(
        'cost' => 13,
        'salt' => $salt //22 chars
    );

    return password_hash( $password . $this->hashingSalt, PASSWORD_BCRYPT, $options);
}
}

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

Может ли кто-нибудь посоветовать, попытаться объяснить, что я полностью просматриваю? Спасибо

Документация по PHP: http://php.net/manual/en/function.password-hash.php


person Jake Ball    schedule 08.04.2013    source источник


Ответы (1)


Соль предназначена для предотвращения возможности создания предварительно вычисленной таблицы с хешами, и она не предназначена для того, чтобы оставаться в безопасности, когда «плохие парни» получают хэши в свои руки.

Кроме того, что вы делаете:

а затем, очевидно, соль, хранящаяся в моем приложении

называется перец (и на самом деле это не так очевидно), и, насколько мне известно, его безопасность не доказана. Для получения дополнительной информации прочитайте это сообщение в блоге (также автором API паролей): http://blog.ircmaxell.com/2012/04/properly-salting-passwords-case-against.html

Также обратите внимание, что ваш метод под названием encrypt ничего не шифрует. Шифрование двухстороннее. То, что вы делаете, называется хешированием: https://stackoverflow.com/a/4948393/508666

person PeeHaa    schedule 08.04.2013
comment
Привет спасибо. Во-первых, спасибо, что научили меня разнице между хешированием и шифрованием, глупая ошибка. Я займусь изменением этого сейчас! Я прочитал обе ссылки и получил ценную информацию о хешировании и API, которые я использую, поэтому я хотел бы поблагодарить вас за это. Итак, во всем я поступаю правильно, только перец не имеет большого значения, верно? - person Jake Ball; 08.04.2013
comment
Хм, я вижу, вы пытаетесь установить соль самостоятельно. В большинстве случаев вы не хотите этого делать, потому что это то, что API сделает за вас, и это то, что можно легко испортить. Если вы хотите узнать, как это работает лучше, вы можете изучить код на PHP. - person PeeHaa; 08.04.2013
comment
Спасибо за ваш ответ, я должен использовать эту библиотеку совместимости, так как я все еще жду, когда мой хост обновится до 5.5›. Я просмотрел код и нашел его весьма полезным на самом деле, причина, по которой мои пароли изначально не проверялись функцией в API, заключается в том, что я хешировал их перед использованием функции password_verify(). Спасибо за вашу помощь, PeeHaa, кажется, я слишком усложняю вещи, что на самом деле ничем не отличается от нормы! Итак, теперь я настроил его так, чтобы он сам занимался всем соляным бизнесом, исключая посредников... спасибо! :) - person Jake Ball; 08.04.2013
comment
@JakeBall - абсолютно согласен с ответом ПиХаа. Есть одна ситуация, когда перец действительно повышает безопасность, в случае, если злоумышленник получил доступ к вашей базе данных (SQL-инъекция), но не знает перец (нет доступа к серверу). Затем перец предотвращает атаки по словарю и может защитить слабые пароли. Чтобы добавить перец, сделайте что-то вроде этого $pepperedPassword = hash_hmac('sha256', $password, $pepper, false);, затем вызовите password_hash() с добавленным паролем. Как уже писал PeeHaa, не передавайте в функцию свою соль. - person martinstoeckli; 08.04.2013
comment
Также, возможно, стоит отметить, что перец следует избегать во всех случаях. Вот объяснение, почему. Существуют лучшие криптографические методы, которые вы можете использовать, которые были действительно изучены и поняты. Вместо того, чтобы изобретать свой собственный метод... - person ircmaxell; 21.06.2013