Лучшие практики: Солить и переполнять пароли?

Я наткнулся на дискуссию, в которой я узнал, что то, что я делал, на самом деле не засовывало пароли, а начинали их, и с тех пор я начал делать обе функции:

hash_function($salt.hash_function($pepper.$password)) [multiple iterations]

Игнорирование выбранного алгоритма хеширования (я хочу, чтобы это обсуждение солей и перцев, а не конкретные алгоритмы, но я использую безопасный), является ли это безопасным вариантом или я должен делать что-то другое? Для тех, кто не знаком с условиями:

  • A salt - это случайное сгенерированное значение, обычно сохраняемое со строкой в ​​базе данных, предназначенное для невозможности использования хеш-таблиц для взлома паролей. Поскольку у каждого пароля есть своя соль, все они должны быть подвергнуты грубой принудительной индивидуальности, чтобы взломать их; однако, поскольку соль хранится в базе данных с помощью хэша паролей, компрометация базы данных означает потерю обоих.

  • A pepper - это статическое значение на всей территории, хранящееся отдельно от базы данных (обычно жестко закодированное в исходном коде приложения), которое должно быть секретным. Он используется так, чтобы компромисс базы данных не приводил к тому, что вся таблица паролей приложений была бы грубой силой.

Есть ли что-нибудь, чего я не вижу, и засовывает и переполняет мои пароли лучшим вариантом для защиты моей безопасности пользователя? Существует ли какой-либо потенциальный недостаток безопасности для этого?

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

Ответ 1

Ok. Увидев, что мне нужно написать об этом over и , я буду сделайте последний канонический ответ только на перец.

Видимый верх перца

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

Вот почему так много людей считают, что перцы - хорошая идея. Это имеет смысл".

Реальность перца

В сферах безопасности и криптографии недостаточно "смысла". Что-то должно быть доказано и иметь смысл, чтобы он считался безопасным. Кроме того, он должен быть реализован в удобном виде. Самая безопасная система, которая не может быть сохранена, считается небезопасной (потому что, если какая-либо часть этой защиты разрушается, вся система разваливается).

И перцы не подходят ни к доказуемым, ни к поддерживаемым моделям...

Теоретические проблемы с перцем

Теперь, когда мы создали сцену, давайте посмотрим, что случилось с перцем.

  • Подача одного хэша в другой может быть опасной.

    В вашем примере вы выполните hash_function($salt . hash_function($pepper . $password)).

    Мы знаем из прошлого опыта, что "просто питание" одного результата хэша в другую хеш-функцию может снизить общую безопасность. Причина в том, что обе хэш-функции могут стать целью атаки.

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

    Дело в том, что, хотя это и не очень важно, это также не просто тривиальная вещь. Криптосистемы предназначены для того, чтобы избежать "необходимости работы", а вместо этого сосредоточиться на случаях "для работы".

    Хотя это может показаться чисто теоретическим, на самом деле это не так. Например, Bcrypt не может принимать произвольные пароли. Таким образом, передача bcrypt(hash(pw), salt) может привести к значительно более слабым хэшам, чем bcrypt(pw, salt), если hash() возвращает двоичную строку.

  • Работа с дизайном

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

    Существующие алгоритмы хеширования пароля (bcrypt, pbkdf2 и т.д.) предназначены только для того, чтобы принимать только одно секретное значение (пароль). Добавление в другой секрет в алгоритм вообще не изучалось.

    Это не значит, что это небезопасно. Это означает, что мы не знаем, безопасно ли это. И общая рекомендация с защитой и криптографией заключается в том, что, если мы не знаем, это не так.

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

  • Сложность - это враг безопасности

    Верьте или нет, Сложность - это враг безопасности. Создание алгоритма, который выглядит сложным, может быть безопасным, а может быть, и нет. Но шансы весьма значимы, что он не защищен.

Значительные проблемы с перцем

  • Неподдерживаемый

    Ваша реализация перца исключает возможность поворота перечного ключа. Поскольку перец используется на входе в одностороннюю функцию, вы никогда не сможете изменить перец на всю жизнь значения. Это означает, что вам нужно будет придумать несколько неуклюжих хаков, чтобы заставить его поддерживать поворот ключа.

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

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

    В основном это делает ваш подход немедленным. "

  • Требуется бросить свой собственный криптографический

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

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

    НИКОГДА не переверните свой собственный крипто...

Лучший способ

Итак, из всех проблем, описанных выше, есть два способа справиться с ситуацией.

  • Просто используйте алгоритмы, которые существуют

    Если вы используете bcrypt или scrypt правильно (с высокой стоимостью), все, кроме самых слабых паролей словаря, должны быть статистически безопасными. Текущая запись для хэширования bcrypt по цене 5 составляет 71 тыс. Хэшей в секунду. При такой скорости даже случайный пароль из 6 символов потребует нескольких лет для взлома. И учитывая, что моя минимальная рекомендуемая стоимость составляет 10, это уменьшает количество хэшей в секунду в 32 раза. Поэтому мы будем говорить только о 2200 хешах в секунду. При такой скорости даже некоторые словарные фразы или модификации могут быть безопасными.

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

  • Шифровать выходной хэш до хранения

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

    Посмотрите на эту строку снова. Скажем, что злоумышленник знает ваш алгоритм (который необходим для обеспечения безопасности, в противном случае это безопасность через неизвестность). Благодаря традиционному перечному подходу злоумышленник может создать пароль дозорного, и, поскольку он знает соль и результат, он может переработать перец. Хорошо, это длинный выстрел, но это возможно. С помощью шифрования злоумышленник ничего не получает. И поскольку соль рандомизирована, пароль дозорного врача даже не поможет ему. Поэтому лучше всего им остается атаковать зашифрованную форму. Это означает, что они сначала должны атаковать ваш зашифрованный хеш, чтобы восстановить ключ шифрования, а затем атаковать хеши. Но там много исследований по атакам шифров, поэтому мы хотим полагаться на это.

TL/DR

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

Ответ 2

Кулак мы должны поговорить о точном преимуществе перца:

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

Типичным сценарием будет SQL-инъекция, выброшенные резервные копии, отброшенные серверы... Эти ситуации не так редки, как кажется, и часто не под вашим контролем (сервер-хостинг). Если вы используете...

  • Уникальная соль за пароль
  • Алгоритм медленного хеширования, такой как BCrypt

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

Второй вопрос: как применить перец?

Часто рекомендуемый способ применения перца состоит в том, чтобы совместить пароль и перец перед передачей его хеш-функции:

$pepperedPassword = hash_hmac('sha512', $password, $pepper);
$passwordHash = bcrypt($pepperedPassword);

Есть еще один лучший способ:

$passwordHash = bcrypt($password);
$encryptedHash = encrypt($passwordHash, $serverSideKey);

Это не только позволяет добавить секретный код сервера, но и позволяет обменивать $serverSideKey, если это необходимо. Этот метод требует немного больше работы, но если код один раз существует (библиотека), нет причин не использовать его.

Ответ 3

Точка соли и перца - это увеличение стоимости предварительно вычисленного поиска пароля, называемого радужным столом.

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

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

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

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

Ответ 4

Невозможно увидеть сохранение жестко заданного значения в исходном коде как релевантность безопасности. Это безопасность через неясность.

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