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



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



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



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



есть ли какие-либо рекомендуемые решения для этого?

683   4  

4 ответов:

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

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

Я приведу немного другой взгляд на это.

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

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

мое обоснование этого подход:

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

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

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

заключение к этому..

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

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

сделайте еще один шаг..

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

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

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

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

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

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

минусы такого подхода:

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

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

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

часто они добавляются к хэшу и хранятся в одном поле.

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

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

основанный на превращаться ASP.NET MVC 4 Web Applications book by William Penberthy:

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

Comments

    Ничего не найдено.