Используя crypt (), как мое приложение проверяет пароли, которые случайно генерируют соли? - PullRequest
3 голосов
/ 31 января 2011

Я смотрю на функцию шифрования PHP и несколько вопросов на Stackoverflow, и я пытаюсь выяснить соленые и хешированные пароли.

Я нашел это на странице сообщества PHP:

<?php
function md5crypt($password){
    // create a salt that ensures crypt creates an md5 hash
    $base64_alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                    .'abcdefghijklmnopqrstuvwxyz0123456789+/';
    $salt='$1$';
    for($i=0; $i<9; $i++){
        $salt.=$base64_alphabet[rand(0,63)];
    }
    // return the crypt md5 password
    return crypt($password,$salt.'$');
}
?>

Как это можно сравнить с:

<?php
// Slightly modified example from PHP community page

$password = trim(mysql_prep($_POST['password']));

// Get the hash, letting the salt be automatically generated
$hashed_password = crypt($password);
?>

Вот выдержка из другого вопроса :

Однако функция PHP crypt () может использовать различные хеши вычислить хеш Когда вы префикс соль с "$ 1 $" вы получите хеш с MD5. Когда вы префикс $ 2 $, вы получаете склеп с рыбой-феном, который более ненадежно.

Префикс "$ 1 $" выводится так что хеш можно проверить. Если оно не было включено, не было бы никакого способа узнать из хранимого хэша, который алгоритм должен быть использован! это информация должна быть сохранена в другом месте. Чтобы избавить вас от этой проблемы PHP включает алгоритм в хеш выход.

У меня немного кружится голова относительно хэшей, шифрования и солей ... но часть, которая действительно меня озадачивает, - это как сравнить введенный пользователем password с salted hashed password, если соль генерируется случайным образом после создания пользователя ... и не сохраняются - и, кроме того, какой смысл использовать crypt () с автоматизированной солью, если вам нужно указать правильный префикс, чтобы иметь возможность снова подтвердить пароль после возврата пользователя?

Ответы [ 4 ]

5 голосов
/ 31 января 2011

Вам нужно хранить соль с пользователем.

Цель соли - обеспечить, чтобы два пользователя с одинаковым паролем получали разные хэши.
Это предотвращает атаки радужных таблиц.

РЕДАКТИРОВАТЬ : Ваша соль должна содержать (криптографически-безопасный-) случайный байт .
Прямо сейчас вы ограничиваете его только буквами и цифрами

1 голос
/ 31 января 2011

Если вы внимательно посмотрите на формат / etc / shadow, вы увидите номенклатуру во втором поле (с : полями-разделителями):

username:${enctype}${salt}$HoPeFuLlYVerYloNGpassWOrDhAsh: ... ... ... 

Соль фактически сохраняется спароль.{enctype} - тип используемого шифрования, {salt} - соль.Поскольку вы знаете тип шифрования и соль, вы можете естественным образом воспроизвести хеш с предоставленным им паролем (таким образом, аутентифицируя пользователя).

Удобная таблица {enctype} значений для crypt (в информационных целях):

          ID  | Method
          ─────────────────────────────────────────────────────────
          1   | MD5
          2a  | Blowfish (not in mainline glibc; added in some
              | Linux distributions)

          5   | SHA-256 (since glibc 2.7)
          6   | SHA-512 (since glibc 2.7)

И, наконец, как PHP позволяет их использовать .

Итак, если вы видите строку типа:

root:$6$foobar$JKLsdiuoilI/KSJHDKUyjh/SHDKJyUYW(....)

Вы знаете, что имеете дело с SHA-512, а соль - это 'foobar' (и, вероятно, учетная запись тоже foobar!).

Это (один) пример того, как солихранятся и связаны с хэшами.Как сказал SLaks , не ограничивайте соль только ASCII.Как минимум, вы должны получать байты от PRNG или HRNG, возвращаясь ко времени () только , когда RNG недоступен.

1 голос
/ 31 января 2011

Идея состоит в том, чтобы иметь случайную соль для каждого пользователя / пароля.

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

Это имеет большое влияние на межсистемную безопасность, так как люди склонны использовать имя пользователя / пароль на большинстве сайтов.

Использование случайной соли делает атаку с помощью словаря практически невозможной, так как вам нужно вычислить любую возможную соль, чтобы угадать любой пароль.

0 голосов
/ 31 января 2011

Нет, вы делаете это неправильно. Используйте solardesigner's PHPASS для выполнения хеширования и проверки. Наконец, никогда НИКОГДА не используйте свою собственную специальную схему, выполнение которой создает проблемы.

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