Какие данные шифруются
Хранилище паролей в браузере представляет собой базу данных, каждая запись которой содержит данные для аутентификации на конкретном сайте. Запись содержит:
- Открытую часть. В незашифрованном виде хранятся адрес сайта, логин, структура и имена полей формы авторизации, статистические данные (например, дата создания пароля или дата последней синхронизации). Благодаря этому браузер может не расшифровывать всё хранилище каждый раз, когда пользователь собирается авторизоваться на каком-то сайте. Чтобы определить, есть ли в базе сохраненные логины от этого сайта, и показать их пользователю, браузеру достаточно незашифрованных данных.
- Закрытую часть. В зашифрованном виде хранятся пароль и примечание. В примечании пользователь может записать информацию, которую можно использовать для взлома пароля — например, ответ на контрольный вопрос. Для шифрования паролей используется алгоритм AES-256-GCM.
Примечание
Если бы все поля записи в базе паролей были зашифрованы, браузеру пришлось бы при каждом вводе пароля расшифровывать хранилище целиком. У браузера нет другого способа проверить, есть ли в базе пароли от этого сайта. Расшифровывать все пароли, когда нужен только один — небезопасно, в момент авторизации злоумышленник может получить доступ к паролям пользователя от разных сайтов.
При шифровании с мастер-паролем, помимо закрытой части записей, шифруются ключи шифрования:
- Ключ шифрования паролей хранится в базе данных паролей и шифруется с помощью асимметричного алгоритма RSA-OAEP. Доступ к ключу шифрования блокируется закрытым ключом.
- Закрытый ключ хранится в базе данных паролей в зашифрованном виде. Доступ к закрытому ключу блокируется мастер-паролем, обработанным функцией хеширования. Мастер-пароль запоминается пользователем и нигде не хранится.
- Запасной ключ шифрования, использующийся для сброса мастер-пароля в случае, если пользователь его забыл, хранится на устройстве пользователя в зашифрованном виде. Доступ к запасному ключу шифрования блокируется ключом, который хранится в Яндекс ID пользователя.
Пример записи из хранилища паролей
{
"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"
}