Веб-приложение - Сохранение пароля

Я что-нибудь пропустил? Существуют ли какие-либо дополнительные шаги по сохранению паролей к БД?

Сохранение пароля:
После максимально возможного изучения предмета я пришел к выводу, что лучший способ хранить пароли пользователей в БД веб-приложений (в моем случае MySQL + PHP) выглядит следующим образом:

  • Назначьте статическую соль для всего сайта. (16 случайных символов, включая 0-9, az, AZ, [] / * - ')
  • Назначьте случайную соль для каждого пользователя (хранящуюся в БД).
  • Сохраните результат hash_function ($ userPassword + $ sitewideSalt + $ randomSalt)
  • Сохраните $ randomSalt вместе с результирующим хешем.
  • Используйте рабочую нагрузку, регулируемую bcrypt хеширование

  • Атака №1: Злоумышленник выгружает базу данных с помощью SQL-инъекции.
    БД результаты наша hash_function и случайный пользовательская соль.

    После свалки злоумышленник мог получите $ userPassword и $ randomSalt , просмотрев его собственный аккаунт. Затем, угадав хэш такую ​​функцию, как md5, он мог запустить Радужная атака на $ sitewideSalt . Но это может занять до 1,41 миллиона столетий [1].

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

  • Атака №2: Злоумышленник находит вектор включения локального файла (LFI).
    Злоумышленник может получить необработанный код для нашего веб-приложения.

    После использования веб-приложения через возможный LFI или RFI [2] злоумышленник читает исходный код для нашей сети приложение и получает наши простые алгоритм и сохраненная
    $ sitewideSalt .


Куда дальше?
Теперь у злоумышленника есть обе возможности, которые он может использовать, чтобы получить настоящие пароли. За исключением того, что он должен создать 1 радужную таблицу для каждого пользователя, поскольку у каждого пользователя есть своя случайная специфическая для пользователя соль ($ randomSalt).

«Современный сервер может вычислить MD5 хэш около 330 МБ каждую секунду. Если у ваших пользователей есть пароли, которые строчные, буквенно-цифровые и 6 длинные символы, вы можете попробовать все единственный возможный пароль такого размера примерно за 40 секунд. "
" ... CUDA, вы можете собрать свой собственный небольшой суперкомпьютерный кластер, который позволит вам пробовать около 700 000 000 паролей в секунду ... "[3]

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

  1. http://www.grc.com/haystack.htm
  2. http://www.wildcardsecurity.com/security101/index.php ? title = Local_File_Inclusion

9
задан davidg 23 June 2011 в 20:21
поделиться