2008-09-13 2 views
5

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

Примеры:

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

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

Как это делает windows/* nix?

ответ

4

Это была общая проблема в UNIX много лет назад, и было разрешено путем разделения компонентов идентификации пользователя (имя пользователя, UID, оболочка, полное имя и т. д.) от компонентов аутентификации (хэш пароля, хэш-пароль пароля). Компоненты идентификации могут быть читаемыми на глобальном уровне (и на самом деле должны быть, если UID должны быть сопоставлены с именами пользователей), но компоненты аутентификации должны быть недоступными для пользователей. Для аутентификации пользователя используйте надежную систему, которая будет принимать имя пользователя и пароль и вернет простой результат «аутентифицирован» или «не аутентифицирован». Эта система должна быть единственным приложением, имеющим доступ к базе данных аутентификации, и должна дождаться случайного промежутка времени (возможно, от 0,1 до 3 секунд), прежде чем отвечать, чтобы избежать атак тайминга.

0

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

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

Unix хранит хэши в текстовом файле/etc/shadow, который доступен только для привилегированных пользователей. Пароли зашифрованы солью.

+0

Кто-то, у кого есть доступ к БД, все еще может получить доступ к учетной записи. Им просто нужно будет временно переименовать имя пользователя. –

+0

Итак, можете ли вы обменять пароли пользователя на два, переместив хэши паролей в этот файл? –

+0

Брайан, если хэш-алгоритм не содержит имя пользователя. –

5

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

На самом деле этого не существует. Любой, кто, как написание доступа к файлу пароля, имеет полный контроль над компьютером.

3

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

4

Я бы пошел с 2, но использую соль. Некоторые псевдокод:

SetPassword(user, password) 
    salt = RandomString() 
    hash = Hashfunction(salt+password) 
    StoreInDatabase(user, salt, hash) 

CheckPassword(user, password) 
    (salt, hash) = GetFromDatabase(user) 
    if Hashfunction(salt+password) == hash 
     return "Success" 
    else 
     return "Login Failed" 

Важно использовать хорошо известный хеш-функции (например, MD5 или SHA-1), реализованный в библиотеке. Не катитесь самостоятельно или не пытайтесь реализовать его из книги, ее просто не стоит рисковать, чтобы это было неправильно.

@Brian R. Bondy: Причина, по которой вы используете соль, заключается в том, чтобы сделать словарный словарь более сложным, злоумышленник не может хешировать словарь и попробовать все пароли, вместо этого она должна взять соль + словарь и хэш , что позволяет ускорить процесс хранения. Если у вас есть словарь из 1000 наиболее часовых паролей и хэш их вам нужно что-то вроде 16 кБ, но если вы добавите две случайные буквы, вы получите 62 * 62 * 16 кБ ≈ 62 Мб.

Иначе вы могли бы использовать какой-то One-time passwords Я слышал хорошие вещи о OTPW, но havent использовал его.

+0

Есть ли какая-либо польза от использования соли, если она также хранится в БД? –

+0

Согласен, но я бы предложил не использовать MD5, если SHA-1 доступен. Уязвимости MD-5 хорошо документированы - SHA-1 «лучше». –

+0

+1 за крик о том, что вы не писали свои собственные криптоалгоритмы :-) –

0

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

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

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

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

0

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

0

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

+0

Правда для многих приложений. Не мой. Иногда база данных делает ссылки на файлы на диске. Доступ к базе данных не дает вам доступа к файлам на диске. –

0

Если «система» является общедоступный веб-сайт RPX может предоставить вам услуги счета Логин/пользователя для наиболее распространенных провайдеров, как OpenId, Facebook, Google и т.д.

Теперь, учитывая то, как вы формулируете свой вопрос. Я думаю, что «система», о которой вы говорите, скорее всего представляет собой внутреннее приложение на базе Windows/Linux. тем не менее, для тех, кто занимается поиском пользователей/пользователей (например, я сделал это до того, как столкнулся с RPX), это может быть хорошо подходит :)

Смежные вопросы