Повышение безопасности входа в систему через Интернет - PullRequest
13 голосов
/ 27 августа 2010

Сейчас моя система входа в систему выглядит следующим образом:

  1. Пароль должен содержать не менее 8 символов и содержать как минимум одну заглавную и строчную буквы, число и символ.
  2. Пароль не может содержать имя пользователя в качестве подстроки.
  3. Имя пользователя, пароль с солью + хешированный (с использованием SHA2), хранящийся в БД.
  4. Одноразовый номер (соль) уникален для каждого пользователя и хранится в виде открытого текста вместе с именем пользователя и паролем.
  5. Весь процесс входа в систему может быть выполнен только через TLS

Как бы вы оценили эффективность следующих мер для повышения безопасности?

  1. Увеличение длины пароля
  2. Заставьте пользователя менять пароль каждый X промежуток времени, иновый пароль не может быть ни одним из последних Y предыдущих паролей
  3. Увеличение размера nonce с 32 байт до 64 байт (удалено из-за бесполезности)
  4. Зашифруйте соль с помощью AES, причем ключ доступен только для приложения, выполняющего аутентификацию
  5. Повторно перефразируйте пароль
  6. Используйте соль, представляющую собой комбинацию более длинного приложениясоль + уникальный пользователь соль на БД.

Мне не очень нравятся 1 и 2, потому что это может причинить неудобства пользователю.
4 и 6, конечно, эффективны только тогда, когда атакаcker скомпрометировал базу данных (например, через инъекцию SQL), но не файловую систему, в которой находится приложение.

Ответы [ 8 ]

6 голосов
/ 31 августа 2010

Ответы могут несколько зависеть от характера сайта, его пользователей и злоумышленников. Например, это тот тип сайта, на котором взломщики могут ориентироваться на определенные учетные записи (возможно, учетные записи «admin»), или это тот сайт, на котором они просто хотят получить как можно больше учетных записей? Насколько технически хороши пользователи и насколько они мотивированы для обеспечения безопасности своей учетной записи? Не зная ответов, я предполагаю, что они не являются техническими и не мотивированы.

Меры, которые могут иметь значение

5) Повторно перефразируйте пароль несколько раз. Это может значительно замедлить все атаки методом перебора - хэш 1000 раз, а атаки методом перебора - в 1000 раз медленнее.

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

6) Используйте соль, которая является комбинацией более длинной соли для всего приложения + уникальной соли пользователя на БД. Если вас беспокоит только пароль, тогда да, это было бы лучше способ достижения того же результата, что и в 4), и, конечно, его очень легко реализовать.

Неэффективные меры

3) Увеличить размер nonce с 32 байт до 64 байт. Вычисление радужных таблиц уже нецелесообразно для любой соли, поэтому это будет иметь значение только в том случае, если соль не была известна взломщик. Однако, если они могут получить хешированный пароль, они также могут получить соль.

Неэффективные и раздражающие меры

1) Увеличение длины пароля Увеличение длины пароля свыше 8 не будет иметь практического значения для времени перебора.

2) Заставить пользователя сменить пароль Я согласен, это всегда будет обходиться. Фактически, это может сделать сайт менее безопасным, потому что люди будут где-то записывать пароль!

3 голосов
/ 01 сентября 2010

Я бы посоветовал вам прочитать http://research.microsoft.com/en-us/um/people/cormac/papers/2009/SoLongAndNoThanks.pdf

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

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

3 голосов
/ 27 августа 2010
  1. Увеличение длины пароля добавляет несколько бит энтропии к паролю.
  2. Требование частой смены пароля обычно вынуждает пользователей использовать менее надежные пароли.Им нужно будет выяснить, какой пароль в мае, июне, июле.Некоторые @ 05x, Некоторые @ 06x, Some@07x.
  3. Не могу сказать наверняка, но я ожидаю, что длина пароля будет более значимой в вашем случае.
  4. Чуть более безопасным.Но если кто-то получит доступ к вашим данным, он, вероятно, сможет получить доступ к ключу.
  5. Кроме увеличения затрат на процессор, вы ничего не получите.

Существует целый ряд хорошо зарекомендовавших себя односторонних алгоритмов шифрования паролей, которые достаточно безопасны.Я бы использовал один из них, а не изобрел свой.Ваши оригинальные предметы 1, 2 и 5 все в порядке.Я бы опустил 3 и 4.

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

2 голосов
/ 31 августа 2010

Для существующих:

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

e2: это начало, но вам, вероятно, следует проверить список плохих паролей (например, «пароль», «qwerty», URL сайта) ... в сети есть несколько списков, которые помогут вам в этом , Учитывая ваши e1 условия, такое сканирование может быть спорным, но тогда, конечно, пользователи не будут иметь имя пользователя с 8 символами, верхний + нижний, символ и число?

e3: Хороший вызов - предотвратите атаки радуги.

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

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

Новые идеи:

n1 + n2: e1 уже достаточно болезненно.

n3: ощутимой пользы нет

n4: Никаких заметных преимуществ - какой бы ни был процесс шифрования, он будет доступен в коде и, следовательно, также может быть скомпрометирован То есть, если ваши БД и серверы приложений не являются двумя разными машинами, защищенными для своих собственных задач - в этом случае все, что вы можете избежать с помощью пароля, будет полезно в случае взлома БД (в этом случае удаление уникальной соли из базы данных поможет ).

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

Дополнительные баллы:

  • Ваша безопасность так же хороша, как и системы, в которых она хранится и обрабатывается. Любая система, которая может быть взломана или уже имеет заднюю дверь (подумайте: количество пользователей, которые могут получить доступ к системе - администраторы сервера, администраторы баз данных, кодировщики и т. Д.), Является слабым звеном.

  • Сценарии обнаружения атак в вашем приложении могут быть полезными, но вы должны знать о атаках типа «отказ в обслуживании» (DoS). Отслеживание неудачных входов в систему и источника - хорошее начало, но учтите, что если вы заблокируете учетную запись при 5 сбоях, кто-то может сделать DoS известную учетную запись (включая учетную запись администратора). Отсутствие возможности использовать приложение может быть так же плохо, как потерять контроль над своей учетной записью. Мультихеш ( n5 ) замедляет этот процесс, выбор более медленного алгоритма хеширования также является хорошим шагом, и, возможно, поможет также отсрочка повторных попыток (1 секунда при первом сбое, 2 секунды, и т.д) - но опять же; быть в курсе дел. Две основные вещи, которые вы можете захотеть отфильтровать: (1) множественные атаки с одного и того же источника / IP (замедлить, в конечном итоге запретить доступ с этого IP - но только временно, так как он может быть законным пользователем), возможно, дальнейшее тестирование для нескольких наборов нескольких атаки. (2) Множественные атаки с разных IP-адресов - при первом подходе блокируется только один пользователь / источник, но если кто-то использует бот-сеть или службу анонимизации, вам нужно искать другой тип подозрительной активности.

  • Возможно ли отключить другую систему?Вы можете использовать LDAP или сервер Active Directory в своем домене или использовать OpenID или OAuth или что-то подобное.Избавьте себя от всех этих головных болей, не загружая работу;) {Межсистемной безопасности все еще нужно заниматься, если вы посредник} Плюс, чем меньше паролей нужно запомнить пользователям (и правилам приписаны к каждому), тем больше вероятность, что онииметь хороший пароль, который не записан и т. д.

2 голосов
/ 27 августа 2010

3 Увеличение размера nonce с 32 байт до 64 байт
4 Шифрование соли с помощью AES с ключом, доступным только для приложения, выполняющего аутентификацию
5 Повторно перефразировать пароль

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

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

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

Независимо от ваших требований к составлению пароля, пользователь все равно может создать «более угадываемый» пароль, например «P @ ssw0rd», который придерживается правила.Таким образом, грубая сила, вероятно, будет успешной для некоторой группы пользователей в любом случае.(Под этим я хочу выделить шаги по предотвращению разглашения паролей.)

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

1 голос
/ 02 сентября 2010

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

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

0 голосов
/ 02 сентября 2010

Как насчет шифрования пароля в клиентском браузере уже с MD5 / SHA, а затем рассматривать хеш как пароль пользователя на стороне сервера.Таким образом, пароль не отображается в виде обычного текста, когда он передается по протоколу SSL / TLS, и никогда не бывает открытым текстом на сервере.Таким образом, даже если он был украден хакерами в любой момент (человек-посредник, сервер / db-хаки), его нельзя использовать для получения доступа к другим веб-службам, где у пользователя может быть такая же электронная почта /комбинированное имя пользователя + пароль (да, это очень распространенное ...)

Это не поможет напрямую обеспечить безопасность входа в систему ВАШЕГО сайта, но, безусловно, остановит распространение взломанных списков паролей в сети, если какой-либо сервер был взломан,Это также может работать в ваших интересах, если другой взломанный сайт применяет тот же подход, пользователь вашего сайта не будет взломан.

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

0 голосов
/ 02 сентября 2010

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

...