Где вы храните свои солевые струны?

Я всегда использовал правильную строку ввода для каждой строки при хешировании паролей для хранения базы данных. Для моих нужд хранение соли в БД рядом с хешированным паролем всегда работало нормально.

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

С точки зрения безопасности стоит ли хранить соли в другом месте? Рассмотрим веб-приложение с кодом сервера и БД на одном компьютере. Если соли хранятся в плоском файле на этой машине, есть вероятность, что если firebase database будет скомпрометирована, файл солей тоже будет.

Есть ли какие-либо рекомендации по этому поводу?

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

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

Я немного поразмыслил над этим.

Я всегда храню соль, смешанную с хешем соленого пароля.

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

Мое обоснование для этого подхода:

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

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

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

Вывод этому ..

1) Никогда не храните данные, которые использует приложение проверки подлинности в его точной форме.

2) Если возможно, сохраните секретную логику аутентификации для дополнительной безопасности.

Идите еще на один шаг ..

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

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

Например, вы генерируете случайную соль размером 512 байт. Вы добавляете соль к своему паролю и получаете hash SHA-512 вашего соленого пароля. Вы также генерируете случайное целое число 200. Затем вы сохраняете первые 200 байт соли, за которым следует hash-залив соленых паролей, за которым следует остальная часть соли.

При аутентификации ввода пароля пользователя ваше приложение будет передавать строку, и первый первый байт данных будет первым 1 байтом соли, за которым следует соленый hash. Этот провал не удастся. Приложение будет продолжаться с использованием первых двух байтов данных в качестве первых 2 байтов соли и повторить до тех пор, пока положительный результат не будет найден после использования первых 200 байтов в качестве первых 200 байтов соли. Если пароль неверен, приложение будет продолжать проверять все перестановки до тех пор, пока не будет найдено ни одного.

Плюсы такого подхода:

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

Недостатки этого подхода:

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

Аутентификация неверных паролей потребует самой высокой стоимости процессора. Это может быть контрпродуктивным для законных запросов, но повышает безопасность против злоумышленников.

Такой подход может быть реализован различными способами и может быть еще более безопасным благодаря использованию солей переменной ширины и / или соленых паролей.

Часто они добавляются в hash и сохраняются в одном поле.

Нет необходимости хранить их отдельно – дело в том, чтобы использовать случайный соль для каждого пароля, чтобы один радужный стол не мог использоваться против всего вашего набора hashей паролей. Со случайными солями атакующий должен грубо заставлять каждый hash отдельно (или вычислять радужный стол для всех возможных солей – значительно больше работы).

Если бы у вас было более безопасное место хранения, было бы целесообразно просто хранить хеши.

На основе разработки ASP.NET MVC 4 веб-приложений книги Уильяма Пенберти:

  1. Получение доступа к солям, хранящимся в отдельной базе данных, требует от хакеров взломать две разные базы данных, чтобы получить доступ к соли и соленному паролю. Хранение их в той же таблице, что и пароль, или даже другая таблица из той же базы данных, означало бы, что, когда хакеры получат доступ к базе данных, они будут иметь доступ как к соли, так и к hashу пароля. Поскольку безопасность включает в себя процесс взлома системы слишком дорого или требует больших затрат времени, чтобы удвоить объем доступа, который должен был получить хакер, должен сделать систему более безопасной.
  2. Простота использования является основной причиной сохранения солей в той же базе данных, что и хешированные пароли. Вам не нужно было бы гарантировать, что две базы данных всегда доступны одновременно и всегда синхронизируются. Преимущество наличия соли минимально, если каждый пользователь имеет рандомизированную соль, потому что, хотя это может облегчить обнаружение пароля пользователя, количество силы, необходимое для взлома паролей системы в целом, будет высоким. На этом уровне обсуждения это действительно то, что ожидание: защитить пароли. Если хакеры приобрели копию базы данных, ваши данные приложения уже скомпрометированы. На данный момент проблема заключается в уменьшении рисков пользователей из-за возможности использования общих паролей.
  3. Требование сохранения двух отдельных связанных баз данных обширно. Конечно, это добавляет восприятие безопасности, но единственным преимуществом, которое он дает, является то, что он защищает пароль, один элемент данных. Если каждое поле в базе данных было зашифровано отдельно, и для этого использовалась та же соль, было бы разумнее хранить его отдельно от данных, поскольку улучшена базовая безопасность вашей системы.
Давайте будем гением компьютера.