Хэш пароля в PHP: правильно ли я это делаю? - PullRequest
2 голосов
/ 24 марта 2012

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

Итак, я создал две функции ... Одна из них для создания хэша, а другая для его проверки.

Проверьте функции:

function createSaltedPass($pass = false, $username = false) {
  if($pass && $username)
  {
    $salt = hash('sha256', uniqid( mt_rand(), true ) . md5(date('d m Y H i s') . " # ") . $username);

    $pass = hash('sha256', $salt . $pass . $salt);

    $pass = $salt . $pass;

    return $pass;
  }
}

Приведенный выше фрагмент кода создает огромный хэш (точнее 128 символов), и я не знаю, действительно ли он безопасен.

Первая половина - соль, и я могу проверить ее, когда она понадобится.

Вторая половина - реальный соленый пароль.

См. Пример пароля:

939cf87873a402d48bcf66a57b64ca38d6f1db9155381ffe1aae9a469e93d1e7ec338071f2dd21a96ef5fc799a3f3921b0df3188458b17422db79271056a1fda

Посмотрите на функцию для проверки пароля после использования первой функции:

function checkSaltedPass($dbPass = false, $pass = false) {
  if($pass && $dbPass)
  {
    $salt = substr($dbPass, 0, 64);

    $pass = hash('sha256', $salt . $pass . $salt);

    $pass = $salt . $pass;

    return $pass;
  }
}

Что вы думаете об этом? Я не специалист по безопасности, и я был бы рад, если бы кто-нибудь дал мне подсказку.

Еще одна вещь: как лучше обработать сеанс, чтобы пользователи оставались в системе?

(извините за плохой английский, это не мой родной язык).

Ответы [ 3 ]

1 голос
/ 24 марта 2012

Я думаю, что функция довольно избыточна. Uniqid уже основан на текущем времени.

function createSaltedPass($pass) {
    $salt = hash('sha256', uniqid( mt_rand(), true ));
    $pass = hash('sha256', $salt . $pass);
    return $salt . $pass;
}

выглядит достаточно для меня

Однако, все эти вещи хеширования не имеют большого значения.
Что действительно важно, так это надежность пароля.
Для хэширования слабых паролей бесполезно.

1 голос
/ 24 марта 2012

В этом случае немного очевидно, что пароль конкатенацируется с двумя хеш-строками sha1, и злоумышленнику проще его взломать, проверяя оба хэша и соль здесь немного бессмысленно, потому что посмотрите на ваш код: Ты просто ... совсем не проверяешь!

По моему мнению, статическая защитная соль может быть позже объединена со статической информацией пользователя, такой как дата регистрации, IP-адрес регистрации (и т. Д.).

Тогда использование будет выглядеть примерно так:

$pass = sha1($password . $staticSalt . $registerDate);

Преимущество этого состоит в том, что если даже злоумышленник обнаружит столкновение с грубой силой, то после помещения найденной строки в поле password пароль будет иметь значение:

$bruteForcedPassword . $staticSalt . $registerDate

Что будет отличаться от хешированного пароля пользователя.

В этом подходе злоумышленник должен знать вашу статическую защитную соль, метод, которым вы строите строку пароля, и дату регистрации пользователя (или другие данные, объединенные в пароль).

Также читайте о timing attacks

Edit: Или просто используйте эту библиотеку для хеширования пароля

0 голосов
/ 24 марта 2012

Вместо функции hash() следует использовать crypt().Лучше всего подходит для хеширования паролей.А также позволяет хранить соль и хеш вместе.

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

Я бы рекомендовал использовать для него «защищенные» файлы cookie:

данные |метка времени |хеш проверки

Хеш проверки создается из data + timestamp + some predefined string.Это позволяет вам убедиться, что пользователь не перепутал часть data.Кроме того, я бы предостерег от использования IP для этого.Хотя это добавило бы дополнительную защиту, это также сделало бы использование мобильных устройств (включая ноутбуки) несколько раздражающим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...