2013-04-05 2 views
1

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

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

Является ли это хорошей идеей или я ужасно ошибочен?

+0

Какой алгоритм хэширования вы планируете использовать? – Mahdi

+1

@Mahdi Не имеет значения, какую функцию хеша вы используете, если его всего 4 цифры ... – rook

ответ

1

В целом, эта функция - плохая идея. Злоумышленнику даже не требуется SQL Injection для компрометации хэша паролей.

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

Аналогичные проблемы имеют зашифрованные файловые системы. Они должны иметь возможность проверять пароль, и они хотят предотвратить автономную грубую силу. Обычно они используют ключевое растягивание, используя bcrypt, scrypt или даже pbkdf2, чтобы тратить достаточное количество ram и CPU, чтобы проверить правильность пароля. bcrypt с несколькими тысячами раундов должен быть достаточным для предотвращения большинства офлайн-атак.

+0

Правильно, я думал о 4-х значках в основном как ПИН-код. я мог бы взять первые 8 цифр или 12 цифр, в основном я просто хочу удостовериться, что все, что я хранил локально, не может быть использовано для извлечения чего-то, что может быть использовано для компрометации пароля на сервере. – Victor

+0

, поэтому я думаю, что мой вопрос на самом деле: помимо использования say bcrypt, действительно ли это было бы замечательной идеей, потому что, даже если он локально скомпрометирован, пароль, хранящийся на сервере, по-прежнему безопасен? – Victor

+0

@Виктор своей плохой идеи в целом, нет действительно надежного способа реализации этого. – rook

1

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

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

  1. Пользователь вводит свой пароль в первый раз.
  2. Мы используем пароль локально с уникальной солью и высоким коэффициентом стоимости и храним его локально.
  3. Мы передаем исходный пароль на сервер.
  4. Сервер хэширует пароль с другой уникальной солью и нормальным коэффициентом затрат и сохраняет его в базе данных.

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

+0

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

+0

@Rook - Вы, вероятно, неправильно поняли важный момент. Это не идея хэшировать пароль локально, отправлять хэш на сервер и хешировать его снова. Вместо этого пароль будет хэшироваться локально (для хранения локального хэша), а затем мы отправляем _original password_ на сервер и снова вводим пароль. Это обычная процедура, единственная разница в том, что мы локально сохраняем независимый хеш. – martinstoeckli

+0

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

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