---
metadata:
  - name: generator
    content: Diplodoc Platform v5.39.1
alternate:
  - https://yandex.com/support/browser-passwords-crypto/en/with-master.md
  - https://yandex.com/support/browser-passwords-crypto/ru/with-master.md
---
> **Documentation Index:** Fetch the complete configuration index at https://yandex.com/support/browser-passwords-crypto/ru/llms.txt

# Шифрование c мастер-паролем

## Принципы защиты ключа шифрования {#passwords-crypt}

Защита ключа шифрования — главное условие безопасности паролей. Если злоумышленник узнает этот ключ, то легко взломает всю базу паролей независимо от того, насколько сложный алгоритм шифрования используется. Поэтому защита ключа [EncKey](*EncKey) основана на следующих принципах:

- Ключ [EncKey](*EncKey) шифруется ассимметричным алгоритмом [RSA-OAEP](https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%B0%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81_%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC).
- Чтобы браузер расшифровал [EncKey](*EncKey) , пользователь должен ввести мастер-пароль. Мастер-пароль известен только владельцу паролей, он не сохраняется на компьютере, и, следовательно, не может быть с него украден. Сразу после расшифровки [EncKey](*EncKey) введенный мастер-пароль удаляется из памяти компьютера.
- Ключ [EncKey](*EncKey) не связан математически с мастер-паролем. Поэтому стойкость [EncKey](*EncKey) к перебору остается постоянной (перебор случайного числа длиной 256 бит) и никак не зависит от сложности мастер-пароля (длина, словарные слова, набор символов).


## Преимущества шифрования с мастер-паролем {#advantages}

Использование шифрования с мастер-паролем дает пользователю следующие преимущества:

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


{% note info %}

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

{% endnote %}



## Процедура шифрования с мастер-паролем {#procedure}

### Шифрование ключа и хранилища {#key-crypto}


{% cut "Схема шифрования ключа и паролей в хранилище" %}

![](_image/crypto-scheme.png)

{% endcut %}


1. Пользователь инициирует создание мастер-пароля.
1. Браузер с помощью системного [генератора случайных чисел](https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8_%D1%81%D1%82%D0%BE%D0%B9%D0%BA%D0%B8%D0%B9_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB) создает ключ [EncKey](*EncKey) длиной 256 бит.
1. Для ключа [EncKey](*EncKey) браузер генерирует случайный идентификатор _key_id_ , который математически не связан с [EncKey](*EncKey). Идентификатор _key_id_  сохраняется в каждой записи в базе паролей. Если пользователь включает шифрование паролей на нескольких несинхронизированных устройствах, могут появиться несколько разных ключей [EncKey](*EncKey). При синхронизации и объединении паролей _key_id_  позволит понять, что чем зашифровано.
1. С помощью [EncKey](*EncKey) браузер шифрует пароли, используя симметричный алгоритм [AES](https://ru.wikipedia.org/wiki/Advanced_Encryption_Standard)-256 в режиме [GСM](https://ru.wikipedia.org/wiki/Galois/Counter_Mode). Расшифровываются пароли из хранилища с помощью того же ключа.
1. Чтобы надежно защитить ключ [EncKey](*EncKey), используется асимметричный алгоритм шифрования [RSA-OAEP](https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%B0%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81_%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC). Для этого браузер генерирует пару ключей: открытый ([PubKey](*PubKey)) и закрытый ([PrivKey](*PrivKey)). Ключ [EncKey](*EncKey) зашифровывается с помощью открытого ключа, а расшифровать его можно только с помощью закрытого ключа [PrivKey](*PrivKey).
    
    {% note info %}
    
    Благодаря шифрованию с открытым ключом браузер может:
    - [менять](#change) мастер-пароль, не меняя ключ шифрования [EncKey](*EncKey);
    - [создать](#restore-key) копию закрытого ключа [PrivKey](*PrivKey) с другой парольной фразой и использовать ее для [резервного доступа](#restore) к хранилищу;
    - добавлять в хранилище пароли, не запрашивая мастер-пароль (например, при [синхронизации](https://yandex.ru/support/browser/device/sync.html) зашифрованного хранилища паролей с
 незашифрованным, незашифрованные пароли можно шифровать с помощью дополнительно
 созданного ключа _EncKey1_).
    
    {% endnote %}
    
1. Чтобы защитить закрытый ключ [PrivKey](*PrivKey) от несанкционированного использования, он шифруется парольной фразой при помощи [AES](https://ru.wikipedia.org/wiki/Advanced_Encryption_Standard)-256-GCM.
1. В качестве парольной фразы используется ключ [UnlockKey](*UnlockKey). Чтобы этот ключ был криптостойким, браузер генерирует его из мастер-пароля, _key_id_  и соли путем многократного хеширования:
    1. Запрашивает у пользователя мастер-пароль.
    1. Добавляет к мастер-паролю [соль](https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BB%D1%8C_(%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F)) и _key_id_ .
    1. Обрабатывает результат 100 500 раз функцией хеширования [PBKDF2](https://ru.wikipedia.org/wiki/PBKDF2)-HMAC-SHA256.

    В результате придуманный человеком мастер-пароль преобразуется в длинный ключ [UnlockKey](*UnlockKey) размером 256 бит. Затрата ресурсов на перебор этого ключа сопоставима с затратой ресурсов на перебор ключа [EncKey](*EncKey).
    
    {% note info %}
    
    Криптоанализ не стоит на месте, исследователи открывают всё более быстрые способы перебора хешей. Поэтому механизм хеширования в браузере архитектурно не завязан на конкретную функцию. При необходимости мы легко сможем заменить PBKDF2 на более криптостойкий вариант.
    
    {% endnote %}
    


{% cut "Пример защиты ключа EncKey мастер-паролем" %}


Открытый ключ [EncKey](*EncKey):

```javascript
Mh6lu1xRuZFo/qJ2yktfJch2nAzlgY4+OPADyLQYfrkbR0hxae9M5nVdafthJa2QHG18sZbf2VOxveH87naRb3vq3oJykfxlVHX4bllYDCcLISzHZVnxF2yMM0r4BXl8Uq+nuINiWx8kaKtrULrdwnMGU6eOuOLZvv/wLDzQvz74iuQUgoR3NSpOByFnY/BkAmGWbQ5KXTYqqIcrcqkG1xb3EAQGEG8KGPtQsTvLsHL1QdjteMZ9CBBLAWjYd/kdrZsx+MU96XMEA+ViBU0ot35cAPVBeWgAyMZhvM9sYy4zB2HrCg+n14kSc85OjNEqAChQDeHVtcbBfyshnKB0Qg==
```

Открытый ключ [PubKey](*PubKey):

```javascript
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyiZMYsF3r121EAqq9spGWDife8bUEr6eyAEP3ip2gm6KaNzkyPGiDXN0zIidMjHKBzxjymtyQyY29DM26w1DQUK6Bd8aNvPXayscHXOKkId7L7+D1qc3mm9FJ/03Yi+pOa4yxVItgUZs9kpyW2LI9begHn62n0d6khsu6A2Iws66rohSXjPo6J2zONpWVn/YNz4o8QyB4O12msEB2Uf+NSFJjqNFAMUmGdTfcpUZ5Qz6Q7V0i5CRgONn2GeqqEaHwa+judPGxrcL1QK3QZGhXChmzwGMAySdVWkwMbQxBMSKMRLbRhM0D19W00TdwYAMLbmX/E8Ekthx1L3WCK7Y1wIDAQAB
```

Зашифрованный открытым ключом _EncKey*_:

```javascript
VlZecAIaRweK2+ZnTAZzKskONjMGqqGWTli0Shr0zFcIQJwNaUSDTdflbSDEdR2KGh5HcShmRRaciQG0A59f8aBlYkoMEqLW+7Hoo1CJsunAxDioSoLf3YlpdfGto5
HFXsuoH1OcRTsKh/yCPiW9FTQrdPTIpLwnQjRi4nDkVLft3aWDlqvqcCHd4EKDTwioTIlhaUGBbfNDP5bQlt+KTl+cdOAQcOv4c1pJhN0hA2G93kLK32zcHIMYf89wmBnP1/leorp38W+hsZcpSJvhV2lufIZ74G0mMA6zBNYOYU/NLss7GpecwAZGcL5rlPbGGATBIoxa9S1QC
1azjI3llQ==
```

Закрытый ключ [PrivKey](*PrivKey):

```javascript
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu6h5dF90Ow7zwFE8KDbspsIbiAnlJJVdWE6BBSk9ecUnvlSeNZe/whbnvAkNF7o9wYstAdKUrKK3T+IJmgvhERgM
QoYlQZQmxm2EP9gsG84h0nWCVL82Sl1CA86Bt2Cr05UHGH9kWMC/FB7coPrURqXbMPtM0cwtWoIqzJJ6+EWkR/ucq8Bbrm9wnK1R3vFGXsFlTLWVmHEyY83gVnqwRR2u70b32j9qM91XevcRqWOYLNLIzio3FHTHuThsyy1cLYJsHPhc6ATqAKtYGcfWN4YPcIW7CG5uB3hFKi/
xGgOYxR38Ursw88rJqn1Od0QFpPLUxoPmXgydNYYIvE0iVAgMBAAECggEADWLWawpx/PjG41qyh9LwMWsUj4Rf8tScP/ali4mb1F74KRExozUbbT1Wsu9p5ZaxvIibBHZI06o7z16T4DOCu3reLi4mm5P373M0NOwAAQqvNTl8FD7BzUeuPggnDXD/LJnE9FwomXWbmkkSX86Yv
d7JvCzMrhVl1z3XD4msamA7VV/NdivL0Mn5cq5F2KGPLxqbH/nLCgxq4/Z0nAWIFJfGCx8C8sRALv2g7qK5PJVQ4VEttLpF6Qco31AwQQ0S2sWer+0y7m+GfZ+1tfdCE6ceZuEt4UsgF7q5at7lBfGHDdmH0F+sOYn+6+szJBPDLUFpO5d6udKGAiJZog23CwKBgQDWoJyFi/iQ
9ww2GzSanRDehNTLvNFqnDMGkrVNwAHhQ1FgXKDeW38ELPHQn21yt4GYzql/yHhS823ce7zLkHvKOcCfHWwHFfJimKqp2Rdp9MU6bU6WgZCNDkTr+AvNpyQ1FmiO/gc6qyB93fe+2RvHHZJ0YXuSG4XDbbQ45rsoKwKBgQDQocPUFV7iLvawmr3qRa8Bn/+0WXHzzdf5Nm8i4iy
faaVdrpvuFl9eIkVGjfYO65jHA+93oru7gWsLg9EPDdBBuADWf1PlIZw1EsykPnRLMBuLQFiPmHZdZSMhNWQWy1T8EOnTsEp9KujerQ9Yk3Uhvln3DrzuWMilqJWj6YQyPwKBgQC9TXRApjBbTEtM/bnsFVTnrykxeh0LdzHaPlQDe7MsyH9iCtEoznK9cBbo93VFlW2NJdqCho
L6RxNDQTBIK+vDdiTbMswxg74CEL2WiZAJOIcs/XQvc5/XihpoNqPSg/V/jYAzfwNJT96cpcb6YewKN58RX1nqiLP2pzAqb/freQKBgCsFUGZJSdmGKaRdJFBMsju5jHbaAt9tUN241c3xqZXtqQXaXZkIz/2PP42+9EA7YLOZIiYfTmrp0vL66X8bMBh9It8YPmp/NcDT8ZLkt
gJTFzrtt9VUcQPtOQM+CTeSEiIwMqdOMO4CjSZttT5kmcCticuiJF9Zu3Y9fy3flzztAoGAMsTJRcyRe0qi0Z4nfpQkND6zPCUiTZwgvb51jQxapgWcR1NYRM0oAocqgftHGPXkxMUz+g08Mg+nzL4Vh8R6UQZE+k1LLOnLWpqRb9I23/hqudld5MJYq5e1tOJ8cwcJ+k6YRxN+
4qpW2qvQSH2g/rh+ynkHeQHxl9OAuRYTYNg=
```

Мастер-пароль:

```javascript
password
```

Соль:

```javascript
/4dMZgU3GG5WfXMjYQbGNzKGxa/7RNFej43Nwx4mpws=
```

Ключ [UnlockKey](*UnlockKey), являющийся парольной фразой к [PrivKey](*PrivKey):

```javascript
UfaND0ks2hulRHkLMGL9Zkpiu1gKBYJdYsqCVTnOIvs=
```


Зашифрованный с помощью _UnlockKey*_  ключ _PrivKey*_:

```javascript
NphBZAm4mu2h4FoS21D6H6MNWxsk2YlD0+JbQQ2S2ujzgQpgF/lq52VU8OT039naB6MQRNxbGRL7G8w+W7MFonMq3bj2pzNTi6qQPqmZmTm1hXp8cFgcBABpZtgBjqY5K
n93WfdIkUCHOR6TscHXD8tnYC5SvVkCr6dsx4XmghoIk3CFr9Fn1ujCvnbVF8z6jjsvSjZcXKU8KluHlxqWiZQEq1k0xohXWq+D/7WH9qGHdgTqgFt35tPCpwcFsDHdXdQ0GoVY6n09xazA9pgvy6xE8QvmwcotV+LAoS6eLdiaQ1h4moymSc3Vrvgk/CQ3SvtTwVqV7Hogv1FT
XOApvlFgVqVnP4i89wFbaR2+oElsa8RwI590DeYP+h9610SCYCPE+1npN4lme1EX3lFh9Ejkmm7KXcH0aw7T1u1UTVUixg/RZv5eYkfSx08I42v6tBSKJUA/5sgJpE3adXgMgggzJonvYDS+oYsGNL2EeCLsLBeKLMGz6cDYbalJFG+wxYYptoN1433GxHvEWtKiXuSbeF+hbrc
kzN+0MujZlEQ20IvgbkbK2ocZbDS7oHySQvc2tT6gIhaXRR021SM127ALmI95lSWIK/rvFJ8LNP5pqyFwval0ushXGURxSzuVfnoBFQjwoPqWY4GUIfebGnC92cZjy4nqloEFDTC0FeKI+zjPkuOXIos+UfTAufaqilw1QSQkTccWh5e2o1w7hEPXx0OyOldXGULvDMDqEncST+
UCOkPSlkRlBuNlqqQ0EDKcDobDATbkiM/i5tTq/kkeYcJkUPXNbvENVRi/0otCJ/nSHK+01Ea0yGavBMy1kc/LDFykC4o3xLiqApsB+9ZveMND0DUY6Ju5/dCWiAUoOO5igXOREJQywmZ13TOfc77b/Bc2z0v9puDon51+9NXlKc1fCde05jsMUAQ98P71hA8XpmpdBG8V9fnBd
NZr6aDjkqspEEeY44kc62/ocqtStQA3m7LHTcOypkgOjoZU1MFtXJE1eAibBC42eK0eufOWfvs31O2VnJNS1WNEoyPFbvumIg9QAR4jDeJKfMiIjHZw0HCubs6LRzH4KLSAIiM7yF6FtU+gfa81VoN+/bA3y6jGlAANf6rL8j89e/SMZSbB0i7s7qZLDUqRyFzcKWsClKObttMY
GPXR+w3m+BKr8APdZbrcGpyQOpR26+dZY+jxpa71Y55w3UwKVP50Df4VVo+ZWfHXI5Z0WW4XDfNe/cRp9aqBYlcCOT2dE67VjOgwVDYES7qiVe6g/fVNg6fLlr/44tqDhOF0Ty79T4URZrCnZPFgP+U4HR51o/v2c1sTIF/ON/FptgVgnKoNNIuFt6YCeEZ4sgd/zo83TkQuTd/
8RyCTof5aDpIlDkbEK+G/5e2vToze+PwvY30qV/EKk5GumoZsOvHzAl1dQpsJsINjN9aXcu7lJ+qH4e3M9VMCY5Ajlov5m3ni9tCnT/yF0il0tbOSQAESw/x/ZgsR2efvMfiGxX2KZ559nrOkk6RwKkkD/rl/hCarZ6rkAfbiuWl1Jl6g+mr+QIOPV+lV62VLagxQXLrjTuV05P
/8L8dVIEvyxa+vWZ6zoX5q4b0oJHglf+viGa2t18LugZ4lBU6djwNFNQJ08DYN9ttYAqY2gUN84b1HEr9Dp8rDIAg=
```


{% endcut %}


### Сохранение пароля от сайта {#saving}


{% cut "Схема шифрования нового пароля" %}

![](_image/saving-pwd-crypto-scheme.png)

{% endcut %}


Если пользователю нужно сохранить новый пароль от сайта, браузер расшифровывает ключ [EncKey](*EncKey), зашифровывает им нужный пароль и отправляет его в базу паролей.

Чтобы сохранить пароль в базу данных:

1. Пользователь хочет сохранить новый пароль.
1. Браузер запрашивает у пользователя мастер-пароль [mPwd](*mPwd) и [генерирует](#unlock-key-generation) ключ [UnlockKey](*UnlockKey).
1. С помощью ключа [UnlockKey](*UnlockKey) браузер извлекает закрытый ключ [PrivKey](*PrivKey).
1. С помощью закрытого ключа [PrivKey](*PrivKey) браузер расшифровывает ключ [EncKey](*EncKey).
1. С помощью ключа [EncKey](*EncKey) браузер зашифровывает пароль и отправляет его в хранилище. После этого мастер-пароль и введенный пользователем пароль удаляются из памяти компьютера.

### Расшифровка пароля {#decrypto}


{% cut "Схема расшифровки пароля" %}

![](_image/decrypto-scheme.png)

{% endcut %}


Ключ [EncKey](*EncKey) расшифровывается, когда пользователю нужно:

- подставить пароль в форму входа на сайт формах авторизации или смены пароля;
- открыть менеджер паролей;

Чтобы получить доступ к хранилищу паролей:

1. Браузер запрашивает у пользователя мастер-пароль [mPwd](*mPwd) и [генерирует](#unlock-key-generation) ключ [UnlockKey](*UnlockKey).
1. С помощью ключа [UnlockKey](*UnlockKey) браузер извлекает закрытый ключ [PrivKey](*PrivKey).
1. С помощью закрытого ключа [PrivKey](*PrivKey) браузер расшифровывает ключ [EncKey](*EncKey).
1. С помощью ключа [EncKey](*EncKey)
 браузер расшифровывает пароль.

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


## Смена мастер-пароля {#change}


{% cut "Схема изменения мастер-пароля" %}

![](_image/change-pwd-scheme.png)

{% endcut %}


[EncKey](*EncKey) не связан с мастер-паролем математически, поэтому для смены мастер-пароля достаточно сменить парольную фразу [UnlockKey](*UnlockKey), блокирующую [PrivKey](*PrivKey). Ключ [EncKey](*EncKey) может остаться прежним.


{% note info %}

Технически нет препятствий, чтобы сгенерировать новый [EncKey](*EncKey), но мы считаем это нецелесообразным. Меняя только ключ [UnlockKey](*UnlockKey), мы избегаем сложной, рискованной и долгой процедуры перешифровки всего хранилища паролей, неизбежной при смене [EncKey](*EncKey).

{% endnote %}


**Подробнее**
1. Браузер запрашивает у пользователя текущий мастер-пароль [mPwd](*mPwd) и [генерирует](#unlock-key-generation) ключ [UnlockKey](*UnlockKey).
1. С помощью ключа [UnlockKey](*UnlockKey) браузер расшифровывает закрытый ключ [PrivKey](*PrivKey).
1. Браузер запрашивает у пользователя новый мастер-пароль _mPwdNew_.
1. С помощью нового мастер-пароля _mPwdNew_ браузер генерирует новый ключ _UnlockKeyNew_ и с его помощью заново шифрует [PrivKey](*PrivKey).


## Создание запасного ключа шифрования {#restore-key}


{% cut "Схема создания запасного ключа" %}

![](_image/recovery-pwd-scheme.png)

{% endcut %}


**Зачем нужен запасной ключ**
:   Пользователь может забыть мастер-пароль. Для такого случая нужен способ восстановить доступ к хранилищу паролей — но такой, чтобы никто, кроме самого пользователя, не мог этого сделать.
    
    Мастер-пароль нужен только для расшифровки закрытого ключа [PrivKey](*PrivKey), поэтому, чтобы получить доступ к хранилищу паролей, достаточно иметь копию этого ключа. Таким образом, задача восстановления мастер-пароля сводится к задаче безопасного хранения копии ключа [PrivKey](*PrivKey).
    
    Запасной ключ шифрования [RecoveryPrivKey](*RecoveryPrivKey) — это и есть копия закрытого ключа. Некоторые системы защиты паролей предлагают пользователю хранить запасной ключ шифрования (или QR-код) в распечатанном виде. Мы считаем этот способ недостаточно безопасным, ведь распечатку можно украсть или потерять.
    
    Мы предлагаем хранить запасной ключ на устройстве в зашифрованном виде, а ключ для его расшифровки [RecoveryUnlockKey](*RecoveryUnlockKey) — отдельно от запасного ключа на сервере Яндекса. При этом, чтобы получить ключ с сервера, пользователю надо будет подтвердить свою личность, введя по памяти пароль от своего [Яндекс ID](https://yandex.ru/support/id/).
    
    Раздельное хранение запасного ключа шифрования и пароля к нему позволяют сбросить мастер-пароль, не создавая дополнительных уязвимостей. Если пользователь забыл мастер-пароль, то он запрашивает пароль от запасной копии закрытого ключа. Браузер расшифровывает [RecoveryPrivKey](*RecoveryPrivKey), а затем зашифровывает его новым мастер-паролем, придуманным пользователем. Доступ к хранилищу паролей восстанавливается без необходимости менять ключ [EncKey](*EncKey) и перешифровывать пароли.

**Этапы создания запасного ключа**
  1. Пользователь соглашается создать ключ для сброса мастер-пароля.
  1. Браузер запрашивает у пользователя мастер-пароль [mPwd](*mPwd) и [генерирует](#unlock-key-generation) ключ [UnlockKey](*UnlockKey).
  1. С помощью ключа [UnlockKey](*UnlockKey) браузер расшифровывает закрытый ключ [PrivKey](*PrivKey).
  1. Если пользователь не авторизован на Яндексе, браузер просит его авторизоваться.
  1. Браузер генерирует случайный 256-битный ключ [RecoveryUnlockKey](*RecoveryUnlockKey) и записывает его в [Яндекс ID](https://yandex.ru/support/id/) пользователя.
  1. Браузер создает ключ [RecoveryPrivKey](*RecoveryPrivKey). Для этого он делает копию расшифрованного ключа [PrivKey](*PrivKey) и зашифровывает его, используя [RecoveryUnlockKey](*RecoveryUnlockKey) в качестве парольной фразы.
  1. Браузер сохраняет [RecoveryPrivKey](*RecoveryPrivKey) на устройство в профиль браузера. В дальнейшем этот ключ хранится только на устройстве пользователя и не загружается на сервера Яндекса при синхронизации.
  1. Чтобы пользователь мог восстановить доступ к паролям с других устройств, при синхронизации браузер отправляет на все устройства пользователя ключ [EncryptedRecoveryPrivKey](*EncryptedRecoveryPrivKey) — копию [RecoveryPrivKey](*RecoveryPrivKey), зашифрованную при помощи [UnlockKey](*UnlockKey).
  1. Как только пользователь синхронизирует другое устройство с сервером Яндекса, ключ [EncryptedRecoveryPrivKey](*EncryptedRecoveryPrivKey) отправляется на это устройство и хранится там в зашифрованном виде.
  1. Когда пользователь в первый раз после синхронизации вводит на другом устройстве мастер-пароль [mPwd](*mPwd), с ключа [EncryptedRecoveryPrivKey](*EncryptedRecoveryPrivKey) снимается дополнительное шифрование. Он преобразуется в ключ [RecoveryPrivKey](*RecoveryPrivKey), защищенный ключом [RecoveryUnlockKey](*RecoveryUnlockKey).
  1. [RecoveryPrivKey](*RecoveryPrivKey) сохраняется на устройстве и никогда не синхронизируется в незашифрованном виде. С его помощью, получив из Яндекс ID [RecoveryUnlockKey](*RecoveryUnlockKey), пользователь сможет сбросить старый мастер-пароль и установить новый.


{% cut "Пример создания запасного ключа" %}


Исходный закрытый ключ [PrivKey](*PrivKey):

```javascript
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu6h5dF90Ow7zwFE8KDbspsIbiAnlJJVdWE6BBSk9ecUnvlSeNZe/whbnvAkNF7o9wYstAdKUrKK3T+IJmgvhERgM
QoYlQZQmxm2EP9gsG84h0nWCVL82Sl1CA86Bt2Cr05UHGH9kWMC/FB7coPrURqXbMPtM0cwtWoIqzJJ6+EWkR/ucq8Bbrm9wnK1R3vFGXsFlTLWVmHEyY83gVnqwRR2u70b32j9qM91XevcRqWOYLNLIzio3FHTHuThsyy1cLYJsHPhc6ATqAKtYGcfWN4YPcIW7CG5uB3hFKi/
xGgOYxR38Ursw88rJqn1Od0QFpPLUxoPmXgydNYYIvE0iVAgMBAAECggEADWLWawpx/PjG41qyh9LwMWsUj4Rf8tScP/ali4mb1F74KRExozUbbT1Wsu9p5ZaxvIibBHZI06o7z16T4DOCu3reLi4mm5P373M0NOwAAQqvNTl8FD7BzUeuPggnDXD/LJnE9FwomXWbmkkSX86Yv
d7JvCzMrhVl1z3XD4msamA7VV/NdivL0Mn5cq5F2KGPLxqbH/nLCgxq4/Z0nAWIFJfGCx8C8sRALv2g7qK5PJVQ4VEttLpF6Qco31AwQQ0S2sWer+0y7m+GfZ+1tfdCE6ceZuEt4UsgF7q5at7lBfGHDdmH0F+sOYn+6+szJBPDLUFpO5d6udKGAiJZog23CwKBgQDWoJyFi/iQ
9ww2GzSanRDehNTLvNFqnDMGkrVNwAHhQ1FgXKDeW38ELPHQn21yt4GYzql/yHhS823ce7zLkHvKOcCfHWwHFfJimKqp2Rdp9MU6bU6WgZCNDkTr+AvNpyQ1FmiO/gc6qyB93fe+2RvHHZJ0YXuSG4XDbbQ45rsoKwKBgQDQocPUFV7iLvawmr3qRa8Bn/+0WXHzzdf5Nm8i4iy
faaVdrpvuFl9eIkVGjfYO65jHA+93oru7gWsLg9EPDdBBuADWf1PlIZw1EsykPnRLMBuLQFiPmHZdZSMhNWQWy1T8EOnTsEp9KujerQ9Yk3Uhvln3DrzuWMilqJWj6YQyPwKBgQC9TXRApjBbTEtM/bnsFVTnrykxeh0LdzHaPlQDe7MsyH9iCtEoznK9cBbo93VFlW2NJdqCho
L6RxNDQTBIK+vDdiTbMswxg74CEL2WiZAJOIcs/XQvc5/XihpoNqPSg/V/jYAzfwNJT96cpcb6YewKN58RX1nqiLP2pzAqb/freQKBgCsFUGZJSdmGKaRdJFBMsju5jHbaAt9tUN241c3xqZXtqQXaXZkIz/2PP42+9EA7YLOZIiYfTmrp0vL66X8bMBh9It8YPmp/NcDT8ZLkt
gJTFzrtt9VUcQPtOQM+CTeSEiIwMqdOMO4CjSZttT5kmcCticuiJF9Zu3Y9fy3flzztAoGAMsTJRcyRe0qi0Z4nfpQkND6zPCUiTZwgvb51jQxapgWcR1NYRM0oAocqgftHGPXkxMUz+g08Mg+nzL4Vh8R6UQZE+k1LLOnLWpqRb9I23/hqudld5MJYq5e1tOJ8cwcJ+k6YRxN+
4qpW2qvQSH2g/rh+ynkHeQHxl9OAuRYTYNg=
```

Запасной ключ шифрования [RecoveryUnlockKey](*RecoveryUnlockKey):

```javascript
d84eaaa2d1a44d7716b59129c9b48b0339b97eb3d3e28405a6e212b8fc82535c
```

Копия закрытого ключа [RecoveryPrivKey](*RecoveryPrivKey), зашифрованная [RecoveryUnlockKey](*RecoveryUnlockKey):

```javascript
NJdSM0ZBf4IbLCcZIcCex/ul3UxkOVdl+05WyRg9yLwP97EKMzy4yMXvLLiq27H/xxfzkAs7DaYWSTqNyW/iGIidpUcyMKffM+P2i4vSjngTpVMQQl0ISQ1P2+Ym5dsUOtMHNh5SPQOVvcgZ0Nvq4GVVMVoX6HlnLsK3EmwBOmlMuuWhHbMPRaiJl4xCRZlmTQlRNbhSQEGNHkcDTPKUG4Li35OSKnZRO2WVUfdgNJeUtUWWncoSLwnxzBqdCvYzdicn0DtagI0aNOoXZgM1gCCfiwIJH5TcrAMELGxbjXo+74hjJ3QdhUqzsHTnghOxp+R8oU6ReGT84J1vhlkhwBX9/kkX+7GPKnJHWt2jASdTxmdf27AA34/e+TeVThPyMQWlVG9GTptzrGjsoAomvWKcJmUJwGlUNytqe9c47iKyeqruzdtvntPeZi5BKmfRdIXjzsmtAnUftLjGLF990t3vmSN0VUrXBNVWsMycvBvAsyOhHjHLfJbHDfKFOgJouBWruHRblpDiWBYlrH/Q4yyEAHb/tDUANu4p3D6sySI8WHLCGXVvXT3V2qbDs82kFETZYwwe6m7T2bjNToh4Vp04KzWCeaq9MMWk0nRIkXogZFN0QzM5Fdm8LMCmecFggGEbcIIdH3hdgqmhmhj8beU6WmxinFOVAGTJg+TnLWPDoFaAI/BHVDUjpICu4iY5jjO4IVwrDqN/EeBC4e98xl+Oi0cXfkwlb+OAZMQBB6r2U5WvawcdLeQVb/GP7N8/n5f6FxVEYfN/jQhe3UNEy7u4QUSXg2o85geZXKJcchxIQ69qfi4sIYqfVqwKIeBl8pZB3L17ErhLaADuEnzWq2B3ZSZswd0HxHIpKYO42OuILEVMyqEMg7QYofTeywa8CReq/Dsd5Jhke7WP5/fAoy7dlfYtkvjQeXIEdL2x6j5ubYUo+dZQpnGJpU/klGJb4qhtVgjx33pEX5RelZNDStDCcUDxUsEluLCISOfsL81w/dunOVtksL9muvn786D1EkuoefGP1KBku8hYW8K19ysF+tD0LI1rEOr6stFFq4yCQUnC+fTex0/gWyrhEp3qEeeG/FHTy60P9vGQvmf0AOXz+Qm0pKB0W0qyHeusVd9EifhkcxMHRYAUWU1tPwDv1++yU6qKLdp7LtMKI1jdoVcH9Kl7oeFhlQpP5/vhXbWdROdaCpdJ41BB3/VfhhfhHqwkwRUZaM3JaquWoL0+TlRkqvd8THRIP5SmSC4w5UtjJKELnvU/WpCsUPjG3Ruqj/drs1uatOYTZJiaalMPP8UjBzdJ6Z5H7MYPiVH2Z7FqeXe+RGTWC9q+jbcGW7D2yjX7WAGh200GlR8jp64HAK/QVvnXyldUd98+BqqDNcct0BjFIXBQPfq4ee3MPyi9WLnFvVMTIEaQp/7KjDarwwUb4BDBmUUuVspMbj/7ijVWX/FT7HYHS+NcU+5t3LjFqoJfHUO4e9g5FpRc3eiIOS6BmZ8XI9zGIpjKOjDOoUcxSmeY06Fx22QUlSsDwGPvyq4bzs+4MNHNmxLjZgSCdh6QzjA4qv7gE0HKsBwh4xRJK8oidvC8kRL5i6h4sF5CyzY7W+mSUaa6nQ+jXlmm7Y8ApnTcFly4ybXWZvp+7lEhfHeZsoRUTdxgLjzaPMeAc+U=
```

Ключ [EncryptedRecoveryPrivKey](*EncryptedRecoveryPrivKey), зашифрованный [UnlockKey](*UnlockKey):

```javascript
7oXPhdrujp/l/wEzBYRFC1ynD2AQATdSkOckzXwiRMeWB4czZjSEZ3u0ZWYy+Hinx80zupFS3A0n7fnzB0Ogs6h6SsMlD1WkImsZ3XaSf98u8VCVm7cILvOvNz5j2xzgFVBmQiyTbgf5NSIwsJte7Uz9p6Bb5fCRcV6sAzt13IdBSXJ6Xa11tUqiMZXn+JYzCzHyh7zAWXr41e9TaWv6mJ3EWw28OSgGD4eeLOxJ3UihzUaFYtlXmJkmUaVZcZwIOXua58FABJqu6IXIgC/Ssoq/biq6sepfVHY4xMgjkfb/KlJzZPjWkmBUJiHgvAibqQDK+lv/TtTwVRSoC4z80SjvnJ37Z4IFE40rSb84A30Va7iHGNeeJx4vqWV8oZJFEwyb9RbuQNICvNo5VkJx465N9d2Nb9iTJx+YhVLAmmtS4kyYk+7CMtIpH9+qM9cJHbgqpSpZ+kr/Go+ljlC0jbCaNVtZEvGMCLmNCGzhsLXbtCwM1zcIQcCvVPCI1jGGLi39P2UYa1pfh78FceCU7558DPiNDWk1VGBYbRBkZ2u1A5Oei+mUpSUdeMRi0jWp2F2SVMX7mzP9njOj6kqmEymgrjSpyA74Cfb2bkXi2nT9bhdOfYZxphBPj8346jZ38tACTLbWDmvbuMt09G8noaAeovZwefkuDzDNHuCz6XJ34nN/LiclmD7MxS5OHHGkfyyLyUhTe3TqjZanNp9bXvs2DVGKVBcY0Q5+Xpt+sNTBCPjZUqTsFOnu06Gj5PQGuOQHXcKWIzQF3vILG84lFF+Eg+5j/3c5YaCoPCzF2kkeqnGe7B/EPeEeEKNJ8ZOOvRWcdxDTHQhpu+SvT98V5X/8uJErqM+pA4FDZ5wOmUD0mSXR4pbv/geD2wlzeQV1AJs2nBR4356TBL9kLOxQu9pDcdsd45PniWzR9leqCYsILzVP8wSVh3gBl7o5fhRnz/YeyFkXF5FUc0hPUG9exAy83zir2i9G1d7DqDvYhYoHUd4lFrezz9p4TNy3QPJzH77fFnbCq7PbuLvbsdwjBzm/h4zab5TSJ2NE543rmo3R1JgNMm3HFbNm69Jj5VoFtODdyFMSnGIM3wqqaiPVAj6oMovCgvqvJ8HcspaLPCczUp+cMdb0HlIRiUKAuVrEqMg4kTs2Mzzu53Q3queeo3jnwWvnclGZnZf1p1uO89n6YBe7BWmFrgO4vtbiziUS1y09PdxBDeUibuzEFj1m8Tevkc9ET9IMtEYPF7M6fRCy7xU63jZDOwOZZSrYNqKVBPabSnRodgn9Mjznn/wDWrQEsdEz6paABZUq58AtGNO/pb5poF8CWmRIEtFn0n9/47kESTcoZM1ycgtGPiZEeNDF0/LndCAmLWiEPEUHuVBfzcyJSD8AJ5FYFJOdx8l7LsWeKIrwOJrMMWsLz5JAoj1pMfJe8P6kgr6+6SIvCDfKiKcJqUrIukUvM7p0TSkbC5Kjt9MskmIRY2UAGvIEYdXscpegSSPOFXPP6zfBbzRMoVSnr89dbDNjfN0qneGI2JLvtwlGKLe1oxodFY+hHE1L76Yz7KX9hfCFT+hDJs3HESzRcMVdIKoym7ikA1PGOn8ioqDFbvsDkNH0vgVtfvb/afH68/MnLPUGVpTkhJzGC478pOZ6tJdwp9ehK0ItqPZkV4UgTaR6oSH2LF/Gne488lACgXIVfdUA38vf
```


{% endcut %}



## Сброс забытого мастер-пароля {#restore}


{% cut "Схема сброса мастер-пароля" %}

![](_image/restore-mpwd-scheme.png)

{% endcut %}



{% note alert %}

Пользователь может сбросить мастер-пароль, только если ранее был создан
 [запасной ключ шифрования](#restore-key). Сбросить мастер-пароль он может
 либо на устройстве, где был создан запасной ключ, либо на устройстве, где после
 синхронизации появилась копия закрытого ключа [EncryptedRecoveryPrivKey](*EncryptedRecoveryPrivKey) и была там расшифрована (после синхронизации пользователь
 хотя бы раз успешно ввел мастер-пароль на этом устройстве).

{% endnote %}


1. Пользователь инициирует сброс мастер-пароля.
1. Браузер запрашивает у пользователя новый мастер-пароль _mPwdNew_.
1. Если пользователь не авторизован на Яндексе или авторизовался больше 5 минут назад, браузер просит его подтвердить свою личность, введя пароль от Яндекс ID. Это позволяет избежать ситуации, когда в момент отсутствия пользователя кто-то другой мог бы воспользоваться его устройством для сброса мастер-пароля.
    
    {% note info %}
    
    При данной авторизации подстановка паролей не работает. Если пользователь не помнит пароль от своего Яндекс ID, сбросить мастер-пароль он не сможет до тех пор, пока не [восстановит доступ](https://yandex.ru/support/passport/support-restore.html) к аккаунту.
    
    {% endnote %}
    
1. Браузер запрашивает у Яндекс ID [RecoveryUnlockKey](*RecoveryUnlockKey) и в случае успешной авторизации получает его.
1. С помощью ключа [RecoveryUnlockKey](*RecoveryUnlockKey) браузер расшифровывает [RecoveryPrivKey](*RecoveryPrivKey). Сразу после этого ключ [RecoveryUnlockKey](*RecoveryUnlockKey) удаляется из памяти устройства и из [Яндекс ID](https://yandex.ru/support/id/) пользователя.
1. С помощью нового мастер-пароля _mPwdNew_ браузер заново шифрует [PrivKey](*PrivKey), создав новый ключ [UnlockKey](*UnlockKey).
1. Браузер [генерирует](#restore-key) новый запасной ключ _RecoveryPrivKeyNew_ и отправляет его на сервер Яндекса.


## Синхронизация паролей {#synch}

### Синхронизация хранилища паролей {#sync-passwords}

При [синхронизации](https://yandex.ru/support/browser/device/sync.html) хранилища, закрытая часть которого защищена мастер-паролем, на сервер отправляются:

- ключ [EncKey](*EncKey) в зашифрованном виде;
- открытый ключ [PubKey](*PubKey);
- закрытый ключ [PrivKey](*PrivKey) в зашифрованном виде;
- хранилище паролей, закрытая часть которого (пароли и примечания) зашифрована;
- запасной ключ [EncryptedRecoveryPrivKey](*EncryptedRecoveryPrivKey) в зашифрованном виде (если он был [создан](#restore-key)).


{% note info %}

Ключ [UnlockKey](*UnlockKey) на сервер не передается и на компьютере не хранится — он вычисляется каждый раз после ввода пользователем мастер-пароля.

{% endnote %}


В процессе передачи с устройства на сервера Яндекса и обратно ваши данные остаются в безопасности за счет следующих факторов:

- протокол [HTTPS](https://yandex.ru/blog/company/77455/) защищает передаваемые данные в целом;
- использование [GСM](https://ru.wikipedia.org/wiki/Galois/Counter_Mode) защищает открытую часть записей от подмены;
- используемое браузером [шифрование](#passwords-crypt) защищает закрытую часть хранилища паролей;
- ключ шифрования защищен мастер-паролем, поэтому никто, даже Яндекс, не сможет его расшифровать.

Таким образом, на серверах Яндекса хранятся в открытом виде адреса сайтов и логины пользователя на этих сайтах, но пароли, примечания и ключ шифрования [EncKey](*EncKey) хранятся в зашифрованном виде. При этом на сервера Яндекса не загружается информация, необходимая для их расшифровки.

### Синхронизация запасного ключа {#sync-recovery-key}

Запасной ключ шифрования [RecoveryPrivKey](*RecoveryPrivKey) создается на устройстве и хранится на нем в зашифрованном виде. Оставлять этот ключ только на устройстве, где он был создан, нельзя — пользователь может потерять устройство и не сможет восстановить доступ к паролям. Создавать запасной ключ на каждом устройстве вручную тоже не годится — можно случайно остаться с тем устройством на руках, на котором ключ создать забыли. Передавать ключ на другие устройства через [синхронизацию](https://yandex.ru/support/browser/device/sync.html) небезопасно, так как пароль от ключа хранится на сервере Яндекса.

Чтобы решить все эти проблемы, на [RecoveryPrivKey](*RecoveryPrivKey) накладывается дополнительное шифрование ключом [UnlockKey](*UnlockKey). Для расшифровки [UnlockKey](*UnlockKey) нужен мастер-пароль, который нигде не хранится, поэтому получившийся в результате ключ [EncryptedRecoveryPrivKey](*EncryptedRecoveryPrivKey) можно спокойно синхронизировать.

После синхронизации на каждом синхронизируемом устройстве в момент первого правильного ввода мастер-пароля с [EncryptedRecoveryPrivKey](*EncryptedRecoveryPrivKey) снимается дополнительное шифрование. Восстановленный ключ [RecoveryPrivKey](*RecoveryPrivKey) остается зашифрованным ключом [RecoveryUnlockKey](*RecoveryUnlockKey). Последний хранится в Яндекс ID пользователя и может быть получен только после явного ввода пользователем пароля от аккаунта. Копия ключа [RecoveryPrivKey](*RecoveryPrivKey) хранится в профиле браузера на устройстве.

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

**Этапы шифрования запасного ключа в процессе синхронизации**
  1. Браузер создает копию ключа [RecoveryPrivKey](*RecoveryPrivKey) и шифрует ее при помощи ключа [UnlockKey](*UnlockKey).
  1. При синхронизации получившаяся копия [EncryptedRecoveryPrivKey](*EncryptedRecoveryPrivKey) отправляется на сервер Яндекса.
  1. Как только пользователь синхронизирует другое устройство с сервером Яндекса,
 ключ [EncryptedRecoveryPrivKey](*EncryptedRecoveryPrivKey) отправляется на это устройство и хранится там в
 зашифрованном виде.
  1. Когда пользователь в первый раз после синхронизации вводит на другом устройстве
 мастер-пароль [mPwd](*mPwd), с
 ключа [EncryptedRecoveryPrivKey](*EncryptedRecoveryPrivKey) снимается дополнительное шифрование. Он
 преобразуется в ключ [RecoveryPrivKey](*RecoveryPrivKey), защищенный ключом [RecoveryUnlockKey](*RecoveryUnlockKey).
  1. [RecoveryPrivKey](*RecoveryPrivKey) сохраняется на устройстве и никогда не синхронизируется в незашифрованном виде. С его помощью, получив из Яндекс ID [RecoveryUnlockKey](*RecoveryUnlockKey), пользователь сможет [сбросить](#restore) старый мастер-пароль и установить новый.


{% include [butt-ind](_includes/button-support-3217b95fdbeb.md) %}

{% include [style-corr-cat-tabs](_includes/style-corrects-cat-tabs-53e796b90204.md) %}


[*EncKey]: Ключ, зашифровывающий хранилище паролей.


[*PubKey]: Открытый ключ. С его помощью зашифровывается ключ _EncKey_. Хранится в открытом (не зашифрованном) виде.


[*PrivKey]: Закрытый ключ. С его помощью расшифровывается ключ _EncKey_. Позволяет расшифровать _EncKey_ и пароли пользователя, поэтому защищен парольной фразой. В качестве парольной фразы используется ключ _UnlockKey_.


[*UnlockKey]: Ключ (парольная фраза), с помощью которой зашифрован _PrivKey_. Результат многократного хеширования мастер-пароля, вычисляется при каждом вводе мастер-пароля.


[*mPwd]: Мастер-пароль. Пользователь запоминает его и вводит каждый раз, когда нужен доступ к паролям от сайтов.


[*RecoveryPrivKey]: Копия закрытого ключа для расшифровки _EncKey_. Используется для сброса мастер-пароля. Хранится на устройстве в зашифрованном виде, для расшифровки необходим _RecoveryUnlockKey_. Для передачи по сети в процессе синхронизации дополнительно шифруется ключом _UnlockKey_.


[*RecoveryUnlockKey]: Ключ, зашифровывающий _RecoveryPrivKey_. Хранится в Яндекс ID.


[*EncryptedRecoveryPrivKey]: Копия закрытого ключа _RecoveryPrivKey_ для сброса мастер-пароля, зашифрованная с помощью _UnlockKey_. Отправляется на сервер для синхронизации с другими устройствами.



