Должен ли я предпочесть хэш-алгоритмы с более длинными выходами для хранения паролей?

Я создаю сайт, на котором безопасность важна (опять же, когда это не важно?), И я искал лучший способ хранить свои пароли. Я знаю, что у MD5 есть проблемы с коллизиями, а также с SHA-1, поэтому я искал возможность хранить свои пароли через SHA-256 или SHA-512.

Разумнее хранить более длинный вариант хеша, чем меньший? (например, 512 против 256). Требуется ли значительно больше времени для взлома пароля в кодировке SHA-512 по сравнению с паролем в кодировке SHA-256?

Также я читал об использовании "солей" для паролей. Что это и как работает? Могу ли я просто сохранить значение соли в другом поле базы данных? Как мне использовать это как часть расчета хеш-значения?


person Naftuli Kay    schedule 14.09.2011    source источник
comment
На этот вопрос был задан очень подробный ответ на IT Security Stack Exchange.   -  person D.W.    schedule 17.09.2011
comment
Перейдите на сайт IT Security Stack Exchange и выполните поиск по хешированию паролей. Это займет около 30 секунд.   -  person D.W.    schedule 17.09.2011


Ответы (3)


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

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

Итак, вам нужен bcrypt.

Для точки размера выходного хэша: если этот размер составляет n бит, тогда n должен быть таким, чтобы злоумышленник не мог реально вычислить хеш-функцию 2 n раз; 80 бит для этого вполне достаточно. Таким образом, выход в 128 бит уже является излишним. Вы все равно не захотите использовать MD5, потому что это слишком быстро (хотя 100000 вложенных вызовов MD5 могут быть достаточно медленными) и потому, что в MD5 были обнаружены некоторые структурные недостатки, которые напрямую не влияют на его безопасность для хеширования паролей, но тем не менее плохие связи с общественностью. В любом случае вы должны использовать bcrypt, а не самодельную структуру.

person Thomas Pornin    schedule 15.09.2011
comment
Почему bcrypt намного лучше другого сильного метода хеширования, такого как sha512? Какие преимущества, помимо математических, он имеет перед другими функциями? - person Naftuli Kay; 17.09.2011
comment
Лучше, потому что он более устойчив к атакам по словарю. Прочтите ответы на IT Security Stack Exchange, чтобы понять ситуацию. Пожалуйста, постарайтесь потратить больше времени на фундаментальное исследование, прежде чем задавать вопросы, которые уже хорошо задокументированы. - person D.W.; 17.09.2011
comment
Существуют и другие варианты помимо bcrypt, такие как старый и одобренный NIST PBKDF2 и новый scrypt. - person Erwan Legrand; 18.12.2013

Некоторые ответы здесь дают вам сомнительный совет. Я рекомендую вам зайти на IT Security Stack Exchange и выполнить поиск по запросу «хеширование паролей». Вы найдете множество советов, и большая часть из них была тщательно проверена людьми на бирже стека безопасности. Или вы можете просто послушать @Thomas Pornin, кто знает, о чем он говорит.

person D.W.    schedule 16.09.2011

Коллизии не имеют отношения к вашему сценарию, поэтому слабые стороны MD5 не актуальны. Однако самое главное - использовать хэш, вычисление которого занимает много времени. Прочтите http://codahale.com/how-to-safely-store-a-password/ и http://www.jasypt.org/howtoencryptuserpasswords.html (даже если вы не используете Java, методы все еще действительны).

В любом случае я бы держался подальше от MD5, поскольку есть и другие хеши, которые работают так же хорошо.

person artbristol    schedule 14.09.2011
comment
MD5 слишком слаб по сегодняшним меркам. Есть готовые радужные таблицы, к которым вы можете приложить руку, и найти источник для данного изображения в хэш-функции не так уж сложно (из-за ошибки алгоритма). Я бы не стал использовать его для паролей, потому что другие вещи, которые я уверен, могут зависеть от цели. - person TCS; 14.09.2011
comment
Да, все, с кем я разговаривал, рекомендовали по возможности держаться подальше от MD5. Я использую его для проверки содержимого файлов, но в остальном я всегда слышал, чтобы использовать SHA-1, если это возможно, или SHA-2, если такая возможность существует. - person Naftuli Kay; 14.09.2011
comment
@TCS не так сложно найти источник для данного изображения в хэш-функции: вы подразумеваете, что существует атака по прообразу. У вас есть источник, подтверждающий это? - person artbristol; 14.09.2011
comment
MD5 не в порядке: он слишком быстрый. - person D.W.; 17.09.2011