Хобрук: Ваш путь к мастерству в программировании

Какова оптимальная длина соли пароля пользователя?

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

08.10.2008

  • У меня нет рекомендаций по длине соли, но ответы, которые здесь появляются, содержат много неверной информации. Ваша соль определенно должна: - быть случайной - быть за секрет (ни одно значение, хранящееся в образе вашей программы или файле конфигурации). Соль не является криптографическим секретом, поэтому хранить ее в таблице не проблема. Единственная цель соли - гарантировать, что при хешировании (или шифровании) разных экземпляров одного и того же элемента вы получите другой результат. 08.10.2008
  • Для тех, кто не знает, что такое соль: ‹a href=en.wikipedia. org / wiki / Salt_ (криптография) ›Salt (криптография) ‹/a› в Википедии 08.10.2008
  • Или есть оптимальное соотношение длины соли к длине хеш-вывода? 8-байтовой соли может быть достаточно для HMAC-SHA-256, но может не хватить для HMAC-SHA-512. 23.02.2011
  • Криптографически случайная соль того же размера, что и результат хэш-функции, означает, что попытка атаки с использованием всех возможных солей (плюс словарь паролей) требует таких же усилий, как попытка атаки с использованием всех возможных результатов хеширования, что является стандартной грубой силой. Более короткая соль означает, что у вас может быть словарь соли плюс словарь паролей в качестве атаки методом грубой силы. 07.07.2011
  • -1 По общему признанию, не отвечает (даже не пытается) ответить на вопрос. 31.08.2011

Ответы:


1

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

Соли должны быть достаточно длинными, чтобы соль каждого пользователя была уникальной. Случайные 64-битные соли вряд ли когда-либо повторится даже с миллиардом зарегистрированных пользователей, так что это должно быть нормально. Однократное повторение соли является относительно незначительной проблемой безопасности, она позволяет злоумышленнику искать сразу в двух учетных записях, но в совокупности не сильно ускоряет поиск по всей базе данных. Даже 32-битные соли подходят для большинства целей, в худшем случае это ускорит поиск злоумышленника примерно на 58%. Стоимость увеличения солей сверх 64 бит невелика, но для этого нет никаких причин с точки зрения безопасности.

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

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

04.03.2011
  • В том, что соли непредсказуемы, есть преимущество. Предсказуемая соль может быть предсказана и использована в атаке по хеш-таблице. Например, если ваша соль - это просто идентификатор пользователя, тогда простая альфа-хеш-таблица, достаточно длинная, будет включать не только все пароли, но и все комбинации имени пользователя и пароля. 07.07.2011
  • Обратите внимание, что в отношении вашего последнего абзаца, если вы используете соль для всего сайта, это должно быть именно так: для всего сайта. Не для всего приложения, т.е. каждый новый экземпляр, который вы устанавливаете своего приложения, должен создавать новую соль для всего сайта. Например, если бы Windows использовала одну и ту же соль для каждой базы данных аутентификации Windows, тогда было бы целесообразно создать радужную таблицу для этой соли, но если бы каждая установка Windows генерировала новую соль, тогда этого не было бы. 07.07.2011
  • Проблема на самом деле не в том, что соль нужно трудно угадывать. Злоумышленнику не нужно угадывать соль: у любого, кто имеет доступ к хешу, уже есть соль. Проблема в том, что если ваши соли очень распространены (например, имена пользователей), они могут быть такими же, как и на других сайтах, и в этот момент злоумышленнику потребуется гораздо меньший набор радужных таблиц, чтобы сделать атаки возможными. Вот почему упоминается идея соли для каждого сайта, чтобы избежать такого рода столкновений с другими сайтами. 24.01.2014
  • Краткое примечание: если в качестве соли используются имена пользователей, это может стать проблемой, если имена пользователей меняются. Практически (несмотря на то, что сказано в проектной документации заказчика) я обнаружил, что пользователи часто хотят изменить имена пользователей. 22.07.2014
  • @ NateC-K, Идея поваренной соли, о которой вы говорите, называется перцем. 10.12.2014

  • 2

    В настоящее время принятые стандарты хеширования паролей создают новую соль длиной 16 символов для каждый пароль и сохраните соль с хешем пароля.

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

    08.10.2008
  • Персонаж немного некорректно определен. Вы должны сказать байт. 08.01.2014
  • @CodesInChaos Я полагаю, вы имеете в виду октет ;-) 06.02.2014
  • Привет! Похоже, что статья в Википедии изменена - возможно, вам стоит обратиться к en.wikipedia.org/wiki/PBKDF2 что ли? 15.05.2014
  • Или еще лучше owasp.org/index.php/Password_Storage_Cheat_Sheet 16.05.2014

  • 3

    Изменить: мой ответ ниже отвечает на заданный вопрос, но «настоящий» ответ таков: просто используйте bcrypt, scrypt или Argon2. Если вы задаете подобные вопросы, вы почти наверняка используете инструменты слишком низкого уровня.

    Честно говоря, нет никаких веских причин, чтобы длина соли не была такой же, как у хешированного пароля. Если вы используете SHA-256, у вас есть 256-битный хеш. Нет причин не использовать 256-битную соль.

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

    08.09.2009
  • Помните, что чем дольше ваш алгоритм соли и хеширования, тем выше производительность вашего сайта. 03.02.2011
  • Это не это большое дело; пользователь едва ли заметит разницу между миллисекундным хешем и полсекундным хешем, плюс хеширование пароля на самом деле должно занять больше времени, чтобы замедлить атаки грубой силы - хотя типичные три удара, заблокированные на 15 минут, лучше . Вы тратите на это циклы ЦП? Да что угодно. В любом случае ЦП тратит больше времени в режиме ожидания, чем на большинстве веб-сайтов, так какое это имеет значение? Если вы столкнулись с проблемами производительности, выполните горизонтальное масштабирование. 04.02.2011
  • Что вы имеете в виду, говоря «Более 256 бит не принесут вам никакого улучшения безопасности»? Я считал, что соль защищала от 03.03.2011
  • Соли защищают от радужных столов. 512-битная соль с 256-битным хешем все равно приведет только к 256 битам энтропии в конечном пароле. 15.03.2011
  • Медленное хеширование - это функция, а не ошибка. 16.09.2011
  • @Stephen Я не согласен. Проблема не в энтропии. Допустим, у нас есть 3-битный хеш, вы говорите, что наличие 3-битной соли в 3-битном хеше так же безопасно, как наличие 9999-битной соли в 3-битном хеш-коде. Это неверно, злоумышленник может просто иметь заранее сгенерированный полный набор радужных таблиц для всех комбинаций вашей 3-битной соли + 3-битного хэша, достигая времени O (1), необходимого для взлома каждой строки, даже если каждый секрет имел свое собственная соль .... 06.07.2012
  • ... Однако, если ваша соль имеет длину 9999 бит, маловероятно, что уже существует предварительно сгенерированная радужная таблица для этой 9999-битной соли. Следовательно, время, необходимое для взлома каждой строки, займет O (m), где m - стоимость выполнения хеширования. 06.07.2012
  • Если у вас 3-битный хеш, ваша 9999-битная соль по-прежнему будет хешировать только до 3 возможных бит энтропии. Радужная таблица должна будет найти только три соли для каждого пароля, которые приведут к разному результату, который является постоянным мультипликативным множителем и, таким образом, отброшен из большого О. 06.07.2012
  • Чтобы уточнить, мне не нужно хранить радужную таблицу с 2 ^ 9 999 солями. Всего восемь (три бита) записей для каждого пароля в радужной таблице. Опять же, вы ничего не приобрели. 06.07.2012
  • @Pacerier, если у вас ограниченный бюджет, вам, вероятно, вообще не следует хранить учетные данные - посмотрите OpenID, или вход в Google или Facebook. 06.07.2012
  • Также обратите внимание, что решение для этих трех битов в точности эквивалентно перебору всего выходного пространства хэша. 06.07.2012
  • @Randolpho У всех ограничен бюджет, и у OpenID есть свои недостатки: quora. ru / OpenID / Что-то-неправильно-с-OpenID 07.07.2012
  • Мне нравится, как вариант входа по умолчанию для предоставленной вами ссылки - это вход в Facebook и Twitter. 08.07.2012
  • @Randolpho Facebook, кстати, не OpenID. 09.07.2012
  • Нет, это особый вариант OAuth. Но я почти уверен, что написал: «Загляните в OpenID», или «войдите в Google» или «Facebook». OpenID - не единственная игра в городе. 09.07.2012
  • @JohnCzajka, хотя это и правда, предложение можно перевернуть, но длинные соли означают, что у процессора больше времени на его взлом. 11.07.2013
  • @Randolpho, я почти уверен, что написал, что Facebook - это не OpenID. Также прочтите эту ссылку. 10.12.2014
  • @StephenTouset, 9999-битная соль по-прежнему будет хешировать только до 3 возможных бит энтропии, но позвольте мне повторить: энтропия здесь не проблема. Не имеет значения, можете ли вы войти в систему как пользователь в этом ................................. ... .................................................. ................................ 10.12.2014
  • .................................................. .................................... особая система. цель солей - остановить атаки перед вычислением, чтобы хэши нельзя было найти и немедленно преобразовать в открытый текст. . С 9999-битной солью ваш пароль остается секретом, тогда как с 3-битной солью ваш пароль теперь известен всему миру (и они могут использовать его для входа в другие ваши учетные записи, поскольку многие люди часто используют пароли повторно). Мне кажется забавным, что 5 человек здесь на самом деле проголосовали за ваш комментарий из-за слова энтропия в нем. 10.12.2014
  • Соли не считаются частными. Если ваша таблица хэшей паролей просочилась, то почти наверняка произошла утечка и ваших солей. 27.09.2016

  • 4

    Википедия:

    Методы SHA2-crypt и bcrypt, используемые в Linux, BSD Unix и Solaris, имеют длину 128 бит. Эти большие значения соли делают предвычислительные атаки с паролем практически любой длины для этих систем в обозримом будущем невозможными.

    128-битной (16-байтовой) соли будет достаточно. Вы можете представить его как последовательность 128 / 4 = 32 шестнадцатеричных цифр.

    12.03.2012
  • Мне кажется, что пример того, что используют другие безопасные системы, является отличным примером того, что является передовой практикой. 01.02.2013
  • @ mklement0 Спасибо, ответ обновил. 14.05.2015

  • 5

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

    Например. Если вы собираетесь использовать SHA-512, используйте 256-битную соль, поскольку безопасность, обеспечиваемая SHA-512, составляет 256 бит.

    13.01.2015
    Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

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

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

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