Необходимость скрывать соль для хеша

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

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

Подумав об этом, я просто не вижу реальной выгоды от этого подхода. Изменение соли из учетной записи в аккаунт все еще затрудняет попытку принудительного использования алгоритма хеширования, даже если злоумышленник знал, как быстро определить, что именно для каждой учетной записи. Это исходит из предположения, что пароли достаточно сильны. (Очевидно, что найти правильный hash для набора паролей, где все они являются двумя цифрами, значительно проще, чем найти правильный hash паролей, который составляет 8 цифр). Я неверен в своей логике, или есть что-то, чего я не хватает?

EDIT: Ладно, вот почему я думаю, что это действительно спор, чтобы зашифровать соль. (lemme знаю, если я на правильном пути).

Для следующего объяснения мы будем предполагать, что пароли всегда состоят из 8 символов, а соль – 5, а все пароли состоят из строчных букв (это просто упрощает математику).

Имея различную соль для каждой записи, я не могу использовать тот же радужный стол (на самом деле технически я мог бы, если бы у меня был один из достаточных размеров, но на этот раз не будем игнорировать). Это реальный ключ к соли из того, что я понимаю, потому что для взлома каждой учетной записи я должен изобретать колесо так, чтобы говорить за каждого. Теперь, если я знаю, как применить правильную соль к паролю для генерации hashа, я бы сделал это, потому что соль действительно просто расширяет длину / сложность хед-фразы. Поэтому я бы сократил количество возможных комбинаций, которые мне нужно было бы генерировать, чтобы «знать». У меня есть пароль + соль от 13 ^ 26 до 8 ^ 26, потому что я знаю, что такое соль. Теперь это облегчает, но все же очень тяжело.

Так на шифрование соли. Если я знаю, что соль зашифрована, я бы не пробовал и не расшифровывал (при условии, что я знаю, что она имеет достаточный уровень шифрования). Я бы проигнорировал это. Вместо того, чтобы пытаться выяснить, как его расшифровать, вернемся к предыдущему примеру, я бы просто создал большую таблицу радуги, содержащую все ключи для 13 ^ 26. Не зная, что соль определенно меня замедлит, но я не думаю, что это добавит монументальную задачу сначала попытаться взломать соль. Вот почему я не думаю, что это того стоит. Мысли?

Вот ссылка, описывающая, как долго будут храниться пароли под грубой силой: http://www.lockdown.co.uk/?pg=combi

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

Скрыть соль не нужно.

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

Из предыдущего моего ответа :

Соль помогает сорвать заранее вычисленные словарные атаки.

Предположим, у злоумышленника есть список вероятных паролей. Он может hash каждый и сравнить его с hashем пароля своей жертвы и посмотреть, совпадает ли он. Если список большой, это может занять много времени. Он не хочет тратить много времени на свою следующую цель, поэтому он записывает результат в «словарь», где хеш указывает на его соответствующий вход. Если список паролей очень и очень длинный, он может использовать такие методы, как Rainbow Table, чтобы сохранить некоторое пространство.

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

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


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

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

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

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

Скрытая соль больше не соль. Это перец. Он имеет свое применение. Он отличается от соли.

Pepper – это секретный ключ, добавленный к паролю + соль, который превращает хеш в HMAC (код аутентификации на основе hash-кода). Хакер с доступом к выходному сигналу hashирования и соль теоретически могут грубой силой угадывать ввод, который будет генерировать hash (и, следовательно, пройти проверку в текстовом поле пароля). Добавляя перец, вы увеличиваете пространство проблем криптографически случайным образом, делая проблему неразрешимой без серьезного аппаратного обеспечения.

Для получения дополнительной информации о перце, проверьте здесь .

См. Также hmac .

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

Рассмотрим следующую таблицу

UserId UserName, Password 1 Fred Hash1 = Sha(Salt1+Password1) 2 Ted Hash2 = Sha(Salt2+Password2) 

Случай 1, когда соль 1 такая же, как соль2. Если Hash2 заменен Hash1, тогда пользователь 2 может войти в систему с помощью пароля пользователя 1

Случай 2, когда соль 1 не совпадает с солью. Если Hash2 заменен Hash1, то пользователь2 не может войти в систему с 1-м паролем пользователей.

… что-то вроде имени пользователя или номера телефона, чтобы солить хеш. …

Мой вопрос в том, нужен ли второй подход? Я понимаю с чисто теоретической точки зрения, что он более безопасен, чем первый подход, но как насчет практичности?

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

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

Есть две техники, с разными целями:

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

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

Я склонен скрывать соль. Я использую 10 бит соли, добавляя случайное число от 1 до 1024 до начала пароля перед его hashированием. При сравнении пароля, введенного пользователем с хешем, я петлю от 1 до 1024 и пробую каждое возможное значение соли, пока не найду совпадение. Это занимает менее 1/10 секунды. У меня возникла идея сделать это так, используя PHP password_hash и password_verify . В моем примере «стоимость» составляет 10 для 10 бит соли. Или, по словам другого пользователя, скрытая «соль» называется «перцем». Соль не зашифрована в базе данных. Это грубо вытеснено. Это сделало бы таблицу радуги необходимой, чтобы перевернуть hash в 1000 раз больше. Я использую sha256, потому что это быстро, но все же считается безопасным.

На самом деле это зависит от того, какой тип атаки вы пытаетесь защитить ваши данные.

objectiveю уникальной соли для каждого пароля является предотrotation атаки словаря на всю базу паролей.

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

 Marianne2ae85fb5d 

hash hash, хранящийся в БД, действительно ли трудно понять, какая часть является проходом, а какая часть – солью?

  • Когда мне понадобится SecureString в .NET?
  • Шифрование / расшифровка classа NSData-AES в cocoa
  • Какая лучшая библиотека шифрования в C / C ++?
  • Как узнать модуль и показатель открытого ключа RSA на iPhone / objective C
  • Как использовать шифрование / дешифрование 3DES в Java?
  • Как шифровать или расшифровывать с помощью Rijndael и размером блока 256 бит?
  • конвертировать ключ openSSH rsa в формат javax.crypto.Cipher
  • Как безопасно отправлять пароль через HTTP?
  • Быстрое и простое строковое шифрование / расшифровка в JAVA
  • Как зашифровать файл с SD-карты с помощью AES на Android?
  • В чем разница между шифрованием и подписью в асимметричном шифровании?
  • Interesting Posts

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

    C # DateTime в формате “YYYYMMDDHHMMSS”

    Почему / когда вы должны использовать вложенные classы в .net? Или не так ли?

    Согласование шаблонов Scala с именем переменной нижнего регистра

    Как я могу изменить количество и размер Linux ramdisks (/ dev / ram0 – / dev / ram15)?

    Что такое синтаксис инициализации структуры тегов?

    AudioTrack, SoundPool или MediaPlayer, которым я должен пользоваться?

    Iphone: как отобразить изображения в каталоге документов в режиме просмотра изображений?

    Могу ли я управлять своим собственным доменом, используя веб-сервер дома без статического IP-адреса с использованием NO-IP?

    Получить URL-адрес от браузера до приложения C #

    jquery.validate.unobtrusive не работает с динамическими инъецированными элементами

    Синхронизировать локальные и удаленные каталоги с помощью rsync?

    Отображать страницу пользовательских ошибок, когда загрузка файла превышает разрешенный размер в ASP.NET MVC

    Обновите настройку system.net системы app.config во время выполнения

    Документы Excel откроют excel с пустым окном

    Давайте будем гением компьютера.