2013-02-08 5 views
3

Был выбран победитель конкурса SHA-3. Алгоритм победителя: Keccak.Хеширование пароля: Keccak или нет

Я использую Blowfish и действительно нравится, но Keccak считается лучшим. Стоит ли использовать его для хранения паролей пользователя на моем веб-сайте?

Если да, существуют ли какие-либо реализации Keccak для PHP, Python, Ruby или любых других языков, используемых в веб-программировании?

Надеюсь, этот вопрос поможет другим людям. Благодаря!

+0

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

+0

Любая точка downvoting? Я искал его и искал похожие вопросы в Stack Overflow. – TheJSB

+0

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

ответ

-2

I use Blowfish and really like it, but Keccak is said to be better.

"Лучше" такое понятие относительное. Лучше в чем? Безопасность, производительность, масштабируемость, переносимость, ...?

Если вы хотите увеличить «безопасность» только для хэширования пользовательских паролей, то Keccak, вероятно, является не хорошим вариантом. Blowfish даст вам лучшую «безопасность», так как в ней потребуется больше времени для перебора хэша, если хэш будет когда-либо обнаружен.

Это говорит о том, что Keccak - достойный вариант, если вы ищете что-то для работы на встроенной архитектуре или хотите большую переносимость. Here is a PHP implementation on github, и here is another Вы также можете сделать свой собственный язык на downloading the Keccak source.

Но, честно говоря, лучше всего придерживаться того, что вы знаете. Если хакер может легко получить хеши blowfish, которые вы используете в настоящий момент, проблема заключается не в алгоритме хэширования, а в доступе к базе данных. Также обратите внимание, что расширение PHP должно быть установлено на ВСЕХ серверах, используя это, что может быть или не быть возможным, если вы используете общий хост.

В действительности вы, вероятно, должны придерживаться того, что у вас есть. Скорее всего, это достаточно безопасно, и как только реализация Keccak будет перенесена на стандартное ядро ​​PHP, вы можете перейти (тогда вам нужно). Только мои два цента.

+0

Спасибо! Отличный ответ. – TheJSB

+5

Извините, но этот старый принятый ответ неверен и потенциально вводит в заблуждение. Keccak - очень быстрый хеш, что означает, что он может быть грубым - злоумышленник может проверить все допустимые пароли открытого текста в разумные сроки. См. Канонический ответ на хранение паролей: http://security.stackexchange.com/questions/211/how-to-securely-hash-passwords/31846#31846 –

+0

@ JesperMortensen: Keccak быстро не мешает его использованию для хэширования паролей , Вы можете сделать это так медленно, как хотите, с помощью итераций, таких как Keccak (Keccak (Keccak (... (Keccak (пароль) || пароль) || ...). Но, вероятно, лучше придерживаться рекомендованных алгоритмов хеширования пароля, которые уже включают такое «замедление». – sellibitze

22

короткий ответ:

Нет, и, наверное, никогда. Для хеширования паролей BCrypt & PBKDF2-HMAC- xxx - лучший выбор, чем любой простой алгоритм SHA-1/2/3. И до тех пор, пока у SHA-1/2 не будет фактических предикатных атак, SHA-3 на самом деле является худшим выбором, в частности , потому что его скорости и низкого размера кеша.

развернутый ответ:

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

Одним из основных критериев SHA-3 является то, что он должен эффективно работать на встроенных архитектурах, которые типичны для небольших объемов кеша, регистров и т. Д.Но это также описывает современные графические процессоры: меньшее количество регистров/аккумуляторов, меньшие по размеру кэши; но на оборотной стороне их кремний оптимизирован для параллельной параллельной работы над большими объемами данных. Это идеально подходит для попыток грубой силы вашего атакующего: навсегда потраченный на кремний доллар, ваш атакующий получает больше хэшей SHA3/сек, покупая другой графический процессор, чем вы, покупая лучший процессор.

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

Вот почему необработанная скорость является врагом хэширования паролей. Вы хотите выбрать алгоритм, чья самая быстрая комбинация программного и аппаратного обеспечения предлагает вашему злоумышленнику наименьшее преимущество за доллар над программным обеспечением/аппаратным обеспечением, которое вы будете использовать. Прямо сейчас, это BCrypt или немного меньший выбор PBKDF2-HMAC- xxx. Поскольку графические процессоры, вероятно, будут лучше собираться на SHA3, я сомневаюсь, что это будет правильный выбор. У меня нет чисел на SHA3, но «более безопасный» не является туманно относительным термином - это правило может использоваться для точного количественного определения.

+0

Это фантастический ответ. Я даже не подумал об этом, но вы @Eli_Collins, сделали очевидным, что более медленный алгоритм выгоден - особенно для хэширования паролей. – ChaseMoskal

4

Это старый вопрос, но похоже, что все снова запутаны cryptography terminology. Давайте разберемся.

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

Я не просто педантичен; эти различия важны, потому что Keccak не конкурирует с bcrypt, он конкурирует с SHA-256.

Вот простой способ safely store a password in PHP:

  1. Использование password_hash(), password_verify() и password_needs_rehash()

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

В настоящее время этот интерфейс обеспечивает bcrypt. Bcrypt в основном в порядке, за исключением нескольких ножные пуль, чтобы следить за:

  1. Он обрезает пароли после того, как 72 символов, что снижает безопасность длинных паролей с низкой энтропии ключевого пространства каждого символа.
  2. Если вы попытаетесь обойти предыдущую футовую пулю путем предварительного хеширования, будьте осторожны, чтобы вы не передавали необработанный двоичный код в bcrypt, потому что он также обрезается после NUL символов.

Если вы беспокоитесь об этих проблемах, существует временная остановка в password_lock.

В PHP 7.2, вероятно, будет возможно использовать Argon2i через этот интерфейс (при условии прохождения RFC).

Через несколько лет (около PHP 7.5, не допуская серьезных ошибок) мы можем видеть, что PASSWORD_ARGON2I станет новым значением для PASSWORD_DEFAULT, но, возможно, нет. У нас есть несколько лет для исследователей криптографии, чтобы получить уверенность в этом.

+2

Как упоминалось в № 2, вы можете победить ограничение на 72 символа на Bcrypt путем предварительного хэширования, ASCII-кодирование пре-хэша, а затем отправить эту ASCII-строку в Bcrypt. В принципе: 'password_hash (base64_encode (hash ('sha256', $ password)), PASSWORD_DEFAULT);' –

+0

@AaronToponce '' hash 'PHP уже возвращает шестнадцатеричную кодированную строку по умолчанию, поэтому вы можете оставить« base64_encode » – CodesInChaos

+0

Или, альтернативно , передать 'true'' hash() '. Причина для кодировки base64 вместо шестнадцатеричного кодирования заключается в том, что вы можете установить более возможные значения перед отключением 72 char, но хэш SHA256 имеет более возможные значения, чем кто-либо когда-либо сможет выполнять итерацию, не говоря уже о попытке хэша bcrypt. –

 Смежные вопросы

  • Нет связанных вопросов^_^