Kohana: понимание и воспроизведение паролей Salt & Hashed с помощью модуля Auth - PullRequest
5 голосов
/ 16 ноября 2009

Я использую Auth Module в Kohana v 2.3.4.

С точки зрения аутентификации пользователей, существует два этапа. Точкой входа является функция входа в систему. Его первой задачей является получение пароля, хранящегося в базе данных, а также получение пароля и определение значения соли. Соль предположительно определяется массивом значений, каждое из которых соответствует точке в хешированном значении $ salt. $ Password, чтобы ввести еще одну часть соли. В моем случае я использую md5.

Проблемы:

  1. Я не могу найти конфигурацию для этого значения СОЛЬ. Кажется, он полагается на пароль, уже сохраненный в базе данных. Есть ли один или мне нужно настроить AUTH для этого, так как этот логин должен быть переносимым и воспроизводимым? Если он не может обнаружить соль, в процедуре hash_password он по умолчанию использует uniqid (), который, я не думаю, является переносимым.

  2. Имеет ли смысл изменять библиотеку Auth для добавления этой функции с точки зрения добавления пользователей? то есть, ввести мой собственный настроенный SALT, который я могу сказать, сделать с ним хеш MD5, а затем использовать этот md5, сгенерированный солью, для заполнения пароля в заданных точках в md5sum?

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

  4. Если вы использовали фреймворк Kohana PHP, если у вас есть какие-то уроки или опыт, которые могут быть использованы после его использования, которые могут дать представление о правильном подходе к этой проблеме, дайте мне знать. Я читаю об этом на многочисленных форумах и вики, и пока не вижу реального конкретного мнения. По сути, я пытаюсь получить воспроизводимый подход для аутентификации кого-либо на этом сайте, как с использованием PHP, так и в конечном итоге с мобильного устройства, такого как iPhone. Я также думаю о том, чтобы в конечном итоге добавить поддержку Google Friend Connect для поддержки OpenID и интеграции.

Ниже приведены фрагменты из модуля Auth в Кохане, касающиеся интересующих функций. В них есть некоторая отладка, так как я пытаюсь лучше понять, что происходит.


public function login($username, $password, $remember = FALSE)
{
    if (empty($password))
        return FALSE;

    if (is_string($password))
    {
        // Get the salt from the stored password
        $salt = $this->find_salt($this->driver->password($username));
        Kohana::log('debug', "--- Auth_Core login salt = $salt ");
        Kohana::log('debug', "--- Auth_Core login pass = $password ");

        // Create a hashed password using the salt from the stored password
        $password = $this->hash_password($password, $salt);
    }
    Kohana::log('debug', "--- Auth_Core login pass_hash = $password ");
    return $this->driver->login($username, $password, $remember);
}
public function find_salt($password)
{
    $salt = '';

    foreach ($this->config['salt_pattern'] as $i => $offset)
    {
        // Find salt characters, take a good long look...
        //$salt .= $password[$offset + $i];
        $salt .= substr($password, $offset + $i, 0);
    }

    return $salt;
}
public function hash_password($password, $salt = FALSE)
{
    Kohana::log('debug', "--- Auth_Core Original Pass = $password ");
    if ($salt === FALSE)
    {
        // Create a salt seed, same length as the number of offsets in the pattern
        $salt = substr($this->hash(uniqid(NULL, TRUE)), 0, count($this->config['salt_pattern']));
        Kohana::log('debug', "--- Auth_Core salt created = $salt ");
    }

    // Password hash that the salt will be inserted into
    $hash = $this->hash($salt.$password);

    // Change salt to an array
    $salt = str_split($salt, 1);

    // Returned password
    $password = '';

    // Used to calculate the length of splits
    $last_offset = 0;

    foreach ($this->config['salt_pattern'] as $offset)
    {
        // Split a new part of the hash off
        $part = substr($hash, 0, $offset - $last_offset);

        // Cut the current part out of the hash
        $hash = substr($hash, $offset - $last_offset);

        // Add the part to the password, appending the salt character
        $password .= $part.array_shift($salt);

        // Set the last offset to the current offset
        $last_offset = $offset;
    }

    Kohana::log('debug', "--- Auth_Core hashpw = $password + $hash ");

    // Return the password, with the remaining hash appended
    return $password.$hash;
}

Ответы [ 2 ]

3 голосов
/ 16 ноября 2009

Проблема 1. Конфигурация соли сохраняется в config/auth.php. Найдите этот файл в modules/auth/config, а затем в папке app/config (как вы, возможно, уже знали, Kohana использует механизм каскадной файловой системы). Файл по умолчанию, который рекомендуется настроить для папки app/config/, выглядит следующим образом:

<?php defined('SYSPATH') OR die('No direct access allowed.');

return array
(
  'driver' => 'ORM',
  'hash_method' => 'sha1',
  'salt_pattern' => '1, 3, 5, 9, 14, 15, 20, 21, 28, 30',
  'lifetime' => 1209600,
  'session_key' => 'auth_user',
  'users' => array
  (
      // 'admin' => 'b3154acf3a344170077d11bdb5fff31532f679a1919e716a02',
  ),
);

Проблема 2. На мой взгляд, механизм хэширования паролей, используемый Auth, который представляет собой SHA1 со вставкой соли, достаточно безопасен, если вы сохраните свои соли, то есть файл auth.php, в безопасности.

Задача 3. Встроенный механизм хэширования Auth использует SHA1, который относительно более устойчив к взлому, чем MD5, поэтому я бы сказал, что не стоит использовать MD5, какой бы сложной ни была ваша схема. смотреть. Эксперт по безопасности Томас Птачек в своем блоге пишет:

Нет, правда. Используйте чужие Система паролей. Не создавай свой собственный.

Большая часть худшей безопасности в отрасли проблемы (как например, плохой LANMAN хэш) произошло потому что умный разработчики подошли к коду безопасности так же, как они сделали остальное их код.

Проблема 4. Да, я использую Kohana для создания веб-сайта моей небольшой компании и веб-сайта некоторых наших клиентов, и до сих пор я не нахожу никаких проблем с модулем Auth, хотя я могу ' не могу сказать много, так как я действительно не использовал его для реального сайта, связанного с безопасностью. Но в целом я бы сказал, что Kohana - это превосходный фреймворк, особенно с механизмом каскадной файловой системы.

3 голосов
/ 16 ноября 2009

Что касается пункта 1 , функция hash_password() используется как для генерации хеша пароля (для соли, так и для соли), который хранится в базе данных (например, во время регистрации), так как а также для воссоздания этого хэша, когда необходимо подтвердить пароль (например, во время входа в систему). Функция hash_password() будет кодировать любую соль, которая задана (или uniqid(), если ни одна не указана) в самом хэше пароля; это форма шифрования, где ключом является salt_pattern; если salt_pattern может храниться в секрете, то это обеспечивает дополнительную безопасность, поскольку злоумышленник не сможет выполнять хэш-перебор в автономном режиме, поскольку метод хеширования не воспроизводится (, если , salt_pattern может храниться в секрете):

// Signup time; forget about uniqid(); you can use any salt that
// you please; once the password hash is stored in the database there
// is no need to know where your salt came from since it will be
// included in the password hash.
$password_hash = hash_password($password, FALSE);

// Login time; note that the salt is taken from the password hash itself.
$reproduced = hash_password($password, find_salt($password_hash));
$verifies   = $password_hash == $reproduced;

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

Относительно пункта 2 , использование вашей собственной соли просто и полностью совместимо с модулем Auth и уже существующей базой данных.

Что касается пункта 3 , использование соли для каждого пользователя (uniqid() по умолчанию) составляет , а не избыточное количество. Особенно с MD5, который сломан в целях безопасности и где обнаружение коллизий уже практично с современной технологией. Еще лучше было бы использовать bcrypt(), который использует целенаправленно более медленный алгоритм хеширования, чтобы помешать попыткам перебора.

Что касается пункта 4 , я раньше не использовал каркас Kohana, но воспроизвести или перенести модуль Auth довольно просто. Необходимо позаботиться о том, чтобы salt_pattern не был забыт или потерян, поскольку он является неотъемлемой частью алгоритма хеширования. salt_pattern также следует хранить в секрете, поскольку это единственное, что удерживает решительного противника от перебора паролей. uniqid() - это просто разумное значение по умолчанию, и его можно заменить на все, что вы хотите (при условии, что это значение для каждого пользователя, а не постоянное значение для всего сайта).


Кроме того, здесь есть очень хороший ответ на стекопоток относительно portable bcrypt() и PHP . Естественно, что не будет совместимо с модулем Auth, но я бы хотел упомянуть об этом в любом случае, так как лучше всего использовать медленный хеш, а не полагаться на секреты, которые трудно хранить, например salt_patten.

...