2013-04-08 2 views
2

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

Я использую двухсторонние соли, поэтому уникальная соль, которую каждый пользователь имеет, а затем, очевидно, соль, хранящаяся в моем приложении, я заметил некоторое довольно странное поведение .. и, согласно документации 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 Doc: http://php.net/manual/en/function.password-hash.php

ответ

4

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

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

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

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

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

+0

Здравствуйте, спасибо. Во-первых, спасибо за то, что я просветил меня о разнице между хэшированием и шифрованием, глупой ошибкой. Я перейду на это сейчас! Я прочитал обе ссылки и получил полезную информацию о хэшировании и api, которые я использую, поэтому я хотел бы поблагодарить вас за это. Итак, во всем, что я делаю правильно, просто перец просто не имеет большого значения, правильно? –

+0

Хммм Я вижу, вы пытаетесь установить соль самостоятельно. В большинстве случаев вы не хотите этого делать, потому что это то, что API сделает для вас, и это то, что можно легко «испортить». Если вы хотите узнать, как это работает, вы можете изучить код [в PHP] (https://github.com/ircmaxell/password_compat). – PeeHaa

+0

Спасибо за ваш ответ, я должен использовать эту совместительную библиотеку, поскольку я все еще жду, пока мой хост обновится до 5.5>. Я просмотрел код, нашел его весьма полезным на самом деле, причина, почему мои пароли первоначально не проверялись функцией внутри api, потому что я их хэшировал, прежде чем использовать функцию password_verify(). Спасибо за вашу помощь PeeHaa, похоже, я слишком усложнял то, что на самом деле, ничем не отличается от нормы! Итак, теперь у меня он настроен на то, чтобы делать весь солевой бизнес сам, исключает среднего человека ... спасибо! :) –

Смежные вопросы