Замена SHA1 на BCRYPT

Я пытался заменить SHA1 как шифрование паролей, возможно, bcrypt или что-то подобное, и я не могу найти пошаговое и простое руководство для реализации этого. Я сделал быстрый учебник на YouTube, который произвел следующий код:

$username = 'myusername';
$password = 'pa55w0rd';

$str  = substr($username, 0, 6);
$salt = '$2a$12$rU8E3fsI9rsKh3V2'.$str.'$';
$pass = crypt($password, $salt);

echo $salt . '<br>' . $pass;

и когда я запускаю код в браузере, это выводит:

$2a$12$rU8E3fsI9rsKh3V2myuser$
$2a$12$rU8E3fsI9rsKh3V2myuseeMSOT1BADLFs/ncqHx5aG2q953uqp.Tu

ВОПРОС 1:

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

ВОПРОС 2:

Почему часть имени пользователя видна в соли и пропуске? Это нормально или нужно предпринять какие-то дополнительные действия, чтобы этого не происходило?

ВОПРОС 3:

Является ли этот подход к хешированию паролей более безопасным, чем md5 и sha1, или есть лучший подход, который мне следует использовать?

Любые предложения приветствуются.


person Donal.Lynch.Msc    schedule 18.05.2013    source источник


Ответы (2)


Я бы рекомендовал использовать новые PHP password_hash и password_verify.

Поскольку у вас, вероятно, нет PHP >= 5.5.0, существует реализация PHP, которая добавляет поддержку предстоящие функции для более старых версий PHP.

Дополнительная информация: https://gist.github.com/nikic/3707231

person Oscar Broman    schedule 18.05.2013
comment
У меня PHP 5.3.0. Стоит ли обновляться до 5.5 и использовать эти функции? Это то, что вы рекомендуете? Используют ли эти функции bcrypt за кулисами?? - person Donal.Lynch.Msc; 18.05.2013
comment
@ DJDonaL3000 Реализация, которую я связал, отлично работает в PHP 5.3, поэтому вам пока не нужно обновляться. Он использует bcrypt, если вы укажете это в password_hash (2-й аргумент). - person Oscar Broman; 18.05.2013
comment
Связанная реализация PHP работает на 5.3.7+. И может работать над реализациями с бэкпортированными исправлениями. Однако, если вы все еще используете версию 5.3.0, я настоятельно рекомендую по возможности обновиться как минимум до последней версии 5.3.x. - person PeeHaa; 19.05.2013

  1. Нет, соль хранится как часть хешированного пароля. Обратите внимание, что хеширование выполняется против радужных атак (предварительно подготовленный хэш-словарь) или подобных.

    Чтобы проверить действительный пароль, функция шифрования может использовать сам хешированный пароль в качестве соли, поскольку она знает, как отделить соль от хеша.] См.: Сравнение паролей с помощью crypt() в PHP

  2. Нет, все в порядке, см. выше.

  3. SHA1 лучше и сильнее, чем MD5, хотя предпочтительнее использовать SHA-2.

person HLL    schedule 18.05.2013