Какие данные шифруются

Хранилище паролей в браузере представляет собой базу данных, каждая запись которой содержит данные для аутентификации на конкретном сайте. Запись содержит:

  • Открытую часть. В незашифрованном виде хранятся адрес сайта, логин, структура и имена полей формы авторизации, статистические данные (например, дата создания пароля или дата последней синхронизации). Благодаря этому браузер может не расшифровывать все хранилище каждый раз, когда пользователь собирается авторизоваться на каком-то сайте. Чтобы определить, есть ли в базе сохраненные логины от этого сайта, и показать их пользователю, браузеру достаточно незашифрованных данных.
  • Закрытую часть. В зашифрованном виде хранятся пароль и примечание. В примечании пользователь может записать информацию, которую можно использовать для взлома пароля — например, ответ на контрольный вопрос. Для шифрования паролей используется алгоритм AES-256-GCM.
Примечание. Если бы все поля записи в базе паролей были зашифрованы, браузеру пришлось бы при каждом вводе пароля расшифровывать хранилище целиком. У браузера нет другого способа проверить, есть ли в базе пароли от этого сайта. Расшифровывать все пароли, когда нужен только один — небезопасно, в момент авторизации злоумышленник может получить доступ к паролям пользователя от разных сайтов.

При шифровании с мастер-паролем, помимо закрытой части записей, шифруются ключи шифрования:

  1. Ключ шифрования паролей хранится в базе данных паролей и шифруется с помощью асимметричного алгоритма RSA-OAEP. Доступ к ключу шифрования блокируется закрытым ключом.
  2. Закрытый ключ хранится в базе данных паролей в зашифрованном виде. Доступ к закрытому ключу блокируется мастер-паролем, обработанным функцией хэширования. Мастер-пароль запоминается пользователем и нигде не хранится.
  3. Запасной ключ шифрования, использующийся для сброса мастер-пароля в случае, если пользователь его забыл, хранится на устройстве пользователя в зашифрованном виде. Доступ к запасному ключу шифрования блокируется ключом, который хранится в аккаунте пользователя на Яндексе.
Пример записи из хранилища паролей
{
  "origin_url" : "https://yandex.ru/",
  "action_url" : "https://passport.yandex.ru/passport",
  "username_element" : "login",
  "username_value" : "user",
  "password_element" : "passwd",
  "password_value" : "{\"c\":\"uZ4qPrUuX8HOab3z1v1Z2tohvRvxAnjqxhszAn3fkmkb9Ac=\",\"e\":\"81f4c75d46018a7eaff00de3e0cf335006d2e5bfc68f3fc4aacc570ece1608ab\",\"p\":\"a+6yHy4TLHjPcVsXud0BkiBTIVLqIShEibd3YNEp\/xhGbxw8oQ==\"}",
  "date_created" : "13155032706798802"
}