Dropbox рассказала, какие технологии компания использует для хранения паролей

Всем известно, что хранить пароли не зашифрованными — плохо. Ведь если кто-то из посторонних получит доступ к базе данных, то беды не избежать. Поэтому в 1976 году придумали односторонний механизм хеширования. Но с ним есть одна проблема. Хотя они и защищают пароли от прямого прочтения в случае взлома, однако абсолютно каждый механизм позволяет перебрать хеши офлайн. Для этого нужно взять список предполагаемых паролей, захешировать их и сравнить с результатом. Из-за этого такие алгоритмы хеширования, как SHA, имеют критическую уязвимость: скорость работы. Современные CPU генерируют миллионы SHA256 хешей в секунду. Специализированные кластеры графических процессоров могут перебирать миллиарды хешей в секунду.

Dropbox поделилась, как в компании организован механизм хранения паролей.


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

Слои защиты паролей

Слои защиты паролей

Мы используем bcrypt — алгоритм хеширования с «солью» для каждого пользователя, и ключ шифрования (или глобальный «перец»), который хранится отдельно. Но наш подход в некоторых моментах существенно отличается от bcrypt.

Сначала не зашифрованный пароль преобразовывается в хеш-значение с использованием SHA512. Из-за этого при использовании bcrypt возникает несколько проблем. Некоторые реализации bcrypt урезают входные данные до 72 байт, что в свою очередь уменьшает энтропию паролей. Другие же реализации вообще не урезают данные, что дает возможность для проведения DoS атак. Обе эти проблемы можно решить применением SHA алгоритма. С его помощью длинным паролям можно задать фиксированную длину объемом 512 бит, что решит обе наши проблемы.

Дальше полученный хеш SHA512 хешируется опять, и если положить cost (параметр функции bcrypt) равным 10, то алгоритм повторится 2^10 раза. В отличие от функций, таких как SHA, bcrypt достаточно медленный и, что не мало важно, его трудно ускорить с помощью обычного железа. Чтобы проделать все нужные манипуляции с паролям на наших серверах при cost равном 10 понадобится 100мс. Что достаточно медленно, а значит более безопасно.

В конце полученный bcrypt хеш шифруется с помощью AES256 и с использованием секретного ключа (общего для все хешей), который мы зовем «перцем». «Перец» обладает несколькими слоями защиты, и его значение хранится отдельно таким образом, чтобы его было сложно обнаружить атакующему (то есть не в базе данных). В результате, даже если хранилище паролей взломали, хеши паролей не представляют никакой пользы для атакующих, ведь они зашифрованы.

Почему вместо bcrypt не использовать scrypt или argon2?

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

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

Почему для шифрования мы используем глобальный «перец» вместо хеширования?

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

В будущем мы планируем хранить глобальный «перец» в HSM (hardware security module). Это будет не просто, но зато позволит уменьшить шансы компрометации «перца». Мы также собираемся улучшить bcrypt в следующем обновлении.

Что дальше?

SHA512 вместе с bcrypt и AES256 — самый сильный и современный метод защиты паролей. В то же время хакеры продолжают развиваться. Но и наша защита тоже. Ведь процедура хеширования паролей — лишь одна из многих мер, которые мы применяем для защиты Dropbox’a. Чтобы обезопасить себя от атак, проводимых полным перебором, мы используем CAPTCHA, ограничение на количество попыток ввода пароля и вообще очень активно применяем различные меры безопасности.

Источник: Dropbox Blog