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