2014-04-02 4 views
0

Я использую:Это хороший/безопасный способ для хеширования паролей PHP

function generateHash($password) { 
    if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) { 
     $salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22); 
     return crypt($password, $salt); 
    } 
} 

для хеширования паролей, но его несовместимый для PHP версии ниже 5.3.7. Итак, я создал эту небольшую функцию для генерации и проверки паролей. Но поскольку я не профессионал в области безопасности, я хочу знать, достаточно ли она защищена или по-прежнему небезопасна.

Моя функция:

//$hash variable is also used to check weather we are creating or verifying passwords. 
function password($password,$hash=FALSE){ 

    $salt=array("hfuiliffa","wiaelfbs","usfewl","fr6j5","gwg8","bs4$","fgthwv");//An array of salts 
    if ($hash){ 
     foreach ($salt as $s1) 
      foreach ($salt as $s2) 
       if ($s1.sha1($s2.$password)===$hash) 
       return true; 

     return FALSE;//If we are still here means time to return false. 
    }else { 
     return $salt[array_rand($salt)].sha1($salt[array_rand($salt)].$password); 
    } 
} 
+0

Если вы используете> PHP 5.5 Вы можете использовать встроенную функцию PHP 'password_hash'. http://www.php.net/manual/en/function.password-hash.php –

+0

Да, но я хочу, чтобы мои скрипты работали практически на всех версиях. –

+0

Я бы рекомендовал создавать случайные соли, а не иметь их в массив. –

ответ

0

Самое лучшее, что вы можете сделать, это использовать новую функцию password_hash(). Как вы уже знаете, есть compatibility pack, работающий для PHP версии 5.3.7. вверх.

Если вам действительно нужно поддерживать более низкие версии PHP, вы можете заменить параметр crypt с «$ 2y $% 02d $» на «$ 2a $% 02d $», это также генерирует хэширование BCrypt. Это лучшее, что вы можете сделать с более старыми версиями. В качестве альтернативы вы можете посмотреть на example code на моей домашней странице.

if (version_compare(PHP_VERSION, '5.3.7') >= 0) 
    $algorithm = '$2y$%02d$'; // BCrypt, with fixed unicode problem 
else 
    $algorithm = '$2a$%02d$'; // BCrypt 

Если вам абсолютно необходимо поддерживать PHP 4.x не существует никакой поддержки BCrypt, в этом случае я бы рекомендовал использовать phpass библиотеку. Кстати ваша схема с постоянными «солями» практически не защищает.

+0

Большое спасибо за это, мне также нужен обзор для моей функции, хорошо ли это использовать? –

+0

@ Субханкер - Извините, что разочаровал вас, но ваша схема с постоянными «солями» чрезвычайно опасна. Так много сделано неправильно, поэтому я бы рекомендовал сначала прочитать мой учебник [безопасно хранить пароли] (http://www.martinstoeckli.ch/hash/en/index.php). – martinstoeckli

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

  • Нет связанных вопросов^_^