Шифрование c мастер-паролем
Принципы защиты ключа шифрования
Защита ключа шифрования — главное условие безопасности паролей. Если злоумышленник узнает этот ключ, то легко взломает всю базу паролей независимо от того, насколько сложный алгоритм шифрования используется. Поэтому защита ключа EncKey основана на следующих принципах:
- Ключ EncKey шифруется ассимметричным алгоритмом RSA-OAEP.
- Чтобы браузер расшифровал EncKey , пользователь должен ввести мастер-пароль. Мастер-пароль известен только владельцу паролей, он не сохраняется на компьютере, и, следовательно, не может быть с него украден. Сразу после расшифровки EncKey введенный мастер-пароль удаляется из памяти компьютера.
- Ключ EncKey не связан математически с мастер-паролем. Поэтому стойкость EncKey к перебору остается постоянной (перебор случайного числа длиной 256 бит) и никак не зависит от сложности мастер-пароля (длина, словарные слова, набор символов).
Преимущества шифрования с мастер-паролем
Использование шифрования с мастер-паролем дает пользователю следующие преимущества:
- Посторонний, имеющий доступ к компьютеру, не сможет воспользоваться паролями.
- Потеря компьютера или кража базы с паролями не влекут необходимости немедленно менять все пароли.
- При синхронизации ни Яндекс, ни кто-либо другой не сможет получить доступ к паролям.
- Пароли в хранилище лучше защищены. Даже если вредоносная программа сможет оттуда украсть ключ шифрования, она не сможет им воспользоваться, так как доступ к ключу блокируется мастер-паролем.
Примечание
Если пользователь использует мастер-пароль, он в любой момент может принудительно сменить ключ шифрования и перешифровать все пароли в хранилище. Для этого достаточно отключить и заново включить мастер-пароль.
Процедура шифрования с мастер-паролем
Шифрование ключа и хранилища
Схема шифрования ключа и паролей в хранилище
-
Пользователь инициирует создание мастер-пароля.
-
Браузер с помощью системного генератора случайных чисел создает ключ EncKey длиной 256 бит.
-
Для ключа EncKey браузер генерирует случайный идентификатор key_id , который математически не связан с EncKey. Идентификатор key_id сохраняется в каждой записи в базе паролей. Если пользователь включает шифрование паролей на нескольких несинхронизированных устройствах, могут появиться несколько разных ключей EncKey. При синхронизации и объединении паролей key_id позволит понять, что чем зашифровано.
-
С помощью EncKey браузер шифрует пароли, используя симметричный алгоритм AES-256 в режиме GСM. Расшифровываются пароли из хранилища с помощью того же ключа.
-
Чтобы надежно защитить ключ EncKey, используется асимметричный алгоритм шифрования RSA-OAEP. Для этого браузер генерирует пару ключей: открытый (PubKey) и закрытый (PrivKey). Ключ EncKey зашифровывается с помощью открытого ключа, а расшифровать его можно только с помощью закрытого ключа PrivKey.
Примечание
Благодаря шифрованию с открытым ключом браузер может:
- менять мастер-пароль, не меняя ключ шифрования EncKey;
- создать копию закрытого ключа PrivKey с другой парольной фразой и использовать ее для резервного доступа к хранилищу;
- добавлять в хранилище пароли, не запрашивая мастер-пароль (например, при синхронизации зашифрованного хранилища паролей с незашифрованным, незашифрованные пароли можно шифровать с помощью дополнительно созданного ключа EncKey1).
-
Чтобы защитить закрытый ключ PrivKey от несанкционированного использования, он шифруется парольной фразой при помощи AES-256-GCM.
-
В качестве парольной фразы используется ключ UnlockKey. Чтобы этот ключ был криптостойким, браузер генерирует его из мастер-пароля, key_id и соли путем многократного хеширования:
- Запрашивает у пользователя мастер-пароль.
- Добавляет к мастер-паролю соль и key_id .
- Обрабатывает результат 100 500 раз функцией хеширования PBKDF2-HMAC-SHA256.
В результате придуманный человеком мастер-пароль преобразуется в длинный ключ UnlockKey размером 256 бит. Затрата ресурсов на перебор этого ключа сопоставима с затратой ресурсов на перебор ключа EncKey.
Примечание
Криптоанализ не стоит на месте, исследователи открывают всё более быстрые способы перебора хешей. Поэтому механизм хеширования в браузере архитектурно не завязан на конкретную функцию. При необходимости мы легко сможем заменить PBKDF2 на более криптостойкий вариант.
Пример защиты ключа EncKey мастер-паролем
Открытый ключ EncKey:
Mh6lu1xRuZFo/qJ2yktfJch2nAzlgY4+OPADyLQYfrkbR0hxae9M5nVdafthJa2QHG18sZbf2VOxveH87naRb3vq3oJykfxlVHX4bllYDCcLISzHZVnxF2yMM0r4BXl8Uq+nuINiWx8kaKtrULrdwnMGU6eOuOLZvv/wLDzQvz74iuQUgoR3NSpOByFnY/BkAmGWbQ5KXTYqqIcrcqkG1xb3EAQGEG8KGPtQsTvLsHL1QdjteMZ9CBBLAWjYd/kdrZsx+MU96XMEA+ViBU0ot35cAPVBeWgAyMZhvM9sYy4zB2HrCg+n14kSc85OjNEqAChQDeHVtcbBfyshnKB0Qg==
Открытый ключ PubKey:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyiZMYsF3r121EAqq9spGWDife8bUEr6eyAEP3ip2gm6KaNzkyPGiDXN0zIidMjHKBzxjymtyQyY29DM26w1DQUK6Bd8aNvPXayscHXOKkId7L7+D1qc3mm9FJ/03Yi+pOa4yxVItgUZs9kpyW2LI9begHn62n0d6khsu6A2Iws66rohSXjPo6J2zONpWVn/YNz4o8QyB4O12msEB2Uf+NSFJjqNFAMUmGdTfcpUZ5Qz6Q7V0i5CRgONn2GeqqEaHwa+judPGxrcL1QK3QZGhXChmzwGMAySdVWkwMbQxBMSKMRLbRhM0D19W00TdwYAMLbmX/E8Ekthx1L3WCK7Y1wIDAQAB
Зашифрованный открытым ключом EncKey*:
VlZecAIaRweK2+ZnTAZzKskONjMGqqGWTli0Shr0zFcIQJwNaUSDTdflbSDEdR2KGh5HcShmRRaciQG0A59f8aBlYkoMEqLW+7Hoo1CJsunAxDioSoLf3YlpdfGto5
HFXsuoH1OcRTsKh/yCPiW9FTQrdPTIpLwnQjRi4nDkVLft3aWDlqvqcCHd4EKDTwioTIlhaUGBbfNDP5bQlt+KTl+cdOAQcOv4c1pJhN0hA2G93kLK32zcHIMYf89wmBnP1/leorp38W+hsZcpSJvhV2lufIZ74G0mMA6zBNYOYU/NLss7GpecwAZGcL5rlPbGGATBIoxa9S1QC
1azjI3llQ==
Закрытый ключ PrivKey:
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=
Мастер-пароль:
password
Соль:
/4dMZgU3GG5WfXMjYQbGNzKGxa/7RNFej43Nwx4mpws=
Ключ UnlockKey, являющийся парольной фразой к PrivKey:
UfaND0ks2hulRHkLMGL9Zkpiu1gKBYJdYsqCVTnOIvs=
Зашифрованный с помощью UnlockKey* ключ PrivKey*:
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=
Сохранение пароля от сайта
Схема шифрования нового пароля
Если пользователю нужно сохранить новый пароль от сайта, браузер расшифровывает ключ EncKey, зашифровывает им нужный пароль и отправляет его в базу паролей.
Чтобы сохранить пароль в базу данных:
- Пользователь хочет сохранить новый пароль.
- Браузер запрашивает у пользователя мастер-пароль mPwd и генерирует ключ UnlockKey.
- С помощью ключа UnlockKey браузер извлекает закрытый ключ PrivKey.
- С помощью закрытого ключа PrivKey браузер расшифровывает ключ EncKey.
- С помощью ключа EncKey браузер зашифровывает пароль и отправляет его в хранилище. После этого мастер-пароль и введенный пользователем пароль удаляются из памяти компьютера.
Расшифровка пароля
Схема расшифровки пароля
Ключ EncKey расшифровывается, когда пользователю нужно:
- подставить пароль в форму входа на сайт формах авторизации или смены пароля;
- открыть менеджер паролей;
Чтобы получить доступ к хранилищу паролей:
- Браузер запрашивает у пользователя мастер-пароль mPwd и генерирует ключ UnlockKey.
- С помощью ключа UnlockKey браузер извлекает закрытый ключ PrivKey.
- С помощью закрытого ключа PrivKey браузер расшифровывает ключ EncKey.
- С помощью ключа EncKey браузер расшифровывает пароль.
При заполнении формы авторизации браузер расшифровывает пароль и вставляет его в форму, после ее отправки расшифрованный пароль удаляется из памяти компьютера.
Смена мастер-пароля
Схема изменения мастер-пароля
EncKey не связан с мастер-паролем математически, поэтому для смены мастер-пароля достаточно сменить парольную фразу UnlockKey, блокирующую PrivKey. Ключ EncKey может остаться прежним.
Примечание
Технически нет препятствий, чтобы сгенерировать новый EncKey, но мы считаем это нецелесообразным. Меняя только ключ UnlockKey, мы избегаем сложной, рискованной и долгой процедуры перешифровки всего хранилища паролей, неизбежной при смене EncKey.
Подробнее
- Браузер запрашивает у пользователя текущий мастер-пароль mPwd и генерирует ключ UnlockKey.
- С помощью ключа UnlockKey браузер расшифровывает закрытый ключ PrivKey.
- Браузер запрашивает у пользователя новый мастер-пароль mPwdNew.
- С помощью нового мастер-пароля mPwdNew браузер генерирует новый ключ UnlockKeyNew и с его помощью заново шифрует PrivKey.
Создание запасного ключа шифрования
Схема создания запасного ключа
- Зачем нужен запасной ключ
-
Пользователь может забыть мастер-пароль. Для такого случая нужен способ восстановить доступ к хранилищу паролей — но такой, чтобы никто, кроме самого пользователя, не мог этого сделать.
Мастер-пароль нужен только для расшифровки закрытого ключа PrivKey, поэтому, чтобы получить доступ к хранилищу паролей, достаточно иметь копию этого ключа. Таким образом, задача восстановления мастер-пароля сводится к задаче безопасного хранения копии ключа PrivKey.
Запасной ключ шифрования RecoveryPrivKey — это и есть копия закрытого ключа. Некоторые системы защиты паролей предлагают пользователю хранить запасной ключ шифрования (или QR-код) в распечатанном виде. Мы считаем этот способ недостаточно безопасным, ведь распечатку можно украсть или потерять.
Мы предлагаем хранить запасной ключ на устройстве в зашифрованном виде, а ключ для его расшифровки RecoveryUnlockKey — отдельно от запасного ключа на сервере Яндекса. При этом, чтобы получить ключ с сервера, пользователю надо будет подтвердить свою личность, введя по памяти пароль от своего Яндекс ID.
Раздельное хранение запасного ключа шифрования и пароля к нему позволяют сбросить мастер-пароль, не создавая дополнительных уязвимостей. Если пользователь забыл мастер-пароль, то он запрашивает пароль от запасной копии закрытого ключа. Браузер расшифровывает RecoveryPrivKey, а затем зашифровывает его новым мастер-паролем, придуманным пользователем. Доступ к хранилищу паролей восстанавливается без необходимости менять ключ EncKey и перешифровывать пароли.
Этапы создания запасного ключа
- Пользователь соглашается создать ключ для сброса мастер-пароля.
- Браузер запрашивает у пользователя мастер-пароль mPwd и генерирует ключ UnlockKey.
- С помощью ключа UnlockKey браузер расшифровывает закрытый ключ PrivKey.
- Если пользователь не авторизован на Яндексе, браузер просит его авторизоваться.
- Браузер генерирует случайный 256-битный ключ RecoveryUnlockKey и записывает его в Яндекс ID пользователя.
- Браузер создает ключ RecoveryPrivKey. Для этого он делает копию расшифрованного ключа PrivKey и зашифровывает его, используя RecoveryUnlockKey в качестве парольной фразы.
- Браузер сохраняет RecoveryPrivKey на устройство в профиль браузера. В дальнейшем этот ключ хранится только на устройстве пользователя и не загружается на сервера Яндекса при синхронизации.
- Чтобы пользователь мог восстановить доступ к паролям с других устройств, при синхронизации браузер отправляет на все устройства пользователя ключ EncryptedRecoveryPrivKey — копию RecoveryPrivKey, зашифрованную при помощи UnlockKey.
- Как только пользователь синхронизирует другое устройство с сервером Яндекса, ключ EncryptedRecoveryPrivKey отправляется на это устройство и хранится там в зашифрованном виде.
- Когда пользователь в первый раз после синхронизации вводит на другом устройстве мастер-пароль mPwd, с ключа EncryptedRecoveryPrivKey снимается дополнительное шифрование. Он преобразуется в ключ RecoveryPrivKey, защищенный ключом RecoveryUnlockKey.
- RecoveryPrivKey сохраняется на устройстве и никогда не синхронизируется в незашифрованном виде. С его помощью, получив из Яндекс ID RecoveryUnlockKey, пользователь сможет сбросить старый мастер-пароль и установить новый.
Пример создания запасного ключа
Исходный закрытый ключ PrivKey:
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:
d84eaaa2d1a44d7716b59129c9b48b0339b97eb3d3e28405a6e212b8fc82535c
Копия закрытого ключа RecoveryPrivKey, зашифрованная RecoveryUnlockKey:
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, зашифрованный UnlockKey:
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
Сброс забытого мастер-пароля
Схема сброса мастер-пароля
Внимание
Пользователь может сбросить мастер-пароль, только если ранее был создан запасной ключ шифрования. Сбросить мастер-пароль он может либо на устройстве, где был создан запасной ключ, либо на устройстве, где после синхронизации появилась копия закрытого ключа EncryptedRecoveryPrivKey и была там расшифрована (после синхронизации пользователь хотя бы раз успешно ввел мастер-пароль на этом устройстве).
-
Пользователь инициирует сброс мастер-пароля.
-
Браузер запрашивает у пользователя новый мастер-пароль mPwdNew.
-
Если пользователь не авторизован на Яндексе или авторизовался больше 5 минут назад, браузер просит его подтвердить свою личность, введя пароль от Яндекс ID. Это позволяет избежать ситуации, когда в момент отсутствия пользователя кто-то другой мог бы воспользоваться его устройством для сброса мастер-пароля.
Примечание
При данной авторизации подстановка паролей не работает. Если пользователь не помнит пароль от своего Яндекс ID, сбросить мастер-пароль он не сможет до тех пор, пока не восстановит доступ к аккаунту.
-
Браузер запрашивает у Яндекс ID RecoveryUnlockKey и в случае успешной авторизации получает его.
-
С помощью ключа RecoveryUnlockKey браузер расшифровывает RecoveryPrivKey. Сразу после этого ключ RecoveryUnlockKey удаляется из памяти устройства и из Яндекс ID пользователя.
-
С помощью нового мастер-пароля mPwdNew браузер заново шифрует PrivKey, создав новый ключ UnlockKey.
-
Браузер генерирует новый запасной ключ RecoveryPrivKeyNew и отправляет его на сервер Яндекса.
Синхронизация паролей
Синхронизация хранилища паролей
При синхронизации хранилища, закрытая часть которого защищена мастер-паролем, на сервер отправляются:
- ключ EncKey в зашифрованном виде;
- открытый ключ PubKey;
- закрытый ключ PrivKey в зашифрованном виде;
- хранилище паролей, закрытая часть которого (пароли и примечания) зашифрована;
- запасной ключ EncryptedRecoveryPrivKey в зашифрованном виде (если он был создан).
Примечание
Ключ UnlockKey на сервер не передается и на компьютере не хранится — он вычисляется каждый раз после ввода пользователем мастер-пароля.
В процессе передачи с устройства на сервера Яндекса и обратно ваши данные остаются в безопасности за счет следующих факторов:
- протокол HTTPS защищает передаваемые данные в целом;
- использование GСM защищает открытую часть записей от подмены;
- используемое браузером шифрование защищает закрытую часть хранилища паролей;
- ключ шифрования защищен мастер-паролем, поэтому никто, даже Яндекс, не сможет его расшифровать.
Таким образом, на серверах Яндекса хранятся в открытом виде адреса сайтов и логины пользователя на этих сайтах, но пароли, примечания и ключ шифрования EncKey хранятся в зашифрованном виде. При этом на сервера Яндекса не загружается информация, необходимая для их расшифровки.
Синхронизация запасного ключа
Запасной ключ шифрования RecoveryPrivKey создается на устройстве и хранится на нем в зашифрованном виде. Оставлять этот ключ только на устройстве, где он был создан, нельзя — пользователь может потерять устройство и не сможет восстановить доступ к паролям. Создавать запасной ключ на каждом устройстве вручную тоже не годится — можно случайно остаться с тем устройством на руках, на котором ключ создать забыли. Передавать ключ на другие устройства через синхронизацию небезопасно, так как пароль от ключа хранится на сервере Яндекса.
Чтобы решить все эти проблемы, на RecoveryPrivKey накладывается дополнительное шифрование ключом UnlockKey. Для расшифровки UnlockKey нужен мастер-пароль, который нигде не хранится, поэтому получившийся в результате ключ EncryptedRecoveryPrivKey можно спокойно синхронизировать.
После синхронизации на каждом синхронизируемом устройстве в момент первого правильного ввода мастер-пароля с EncryptedRecoveryPrivKey снимается дополнительное шифрование. Восстановленный ключ RecoveryPrivKey остается зашифрованным ключом RecoveryUnlockKey. Последний хранится в Яндекс ID пользователя и может быть получен только после явного ввода пользователем пароля от аккаунта. Копия ключа RecoveryPrivKey хранится в профиле браузера на устройстве.
Таким образом пользователь может восстановить мастер-пароль с любого синхронизированного устройства, если он хотя бы раз после синхронизации вводил на нем мастер-пароль. При этом во время передаче по сети запасной ключ остается защищенным.
Этапы шифрования запасного ключа в процессе синхронизации
- Браузер создает копию ключа RecoveryPrivKey и шифрует ее при помощи ключа UnlockKey.
- При синхронизации получившаяся копия EncryptedRecoveryPrivKey отправляется на сервер Яндекса.
- Как только пользователь синхронизирует другое устройство с сервером Яндекса, ключ EncryptedRecoveryPrivKey отправляется на это устройство и хранится там в зашифрованном виде.
- Когда пользователь в первый раз после синхронизации вводит на другом устройстве мастер-пароль mPwd, с ключа EncryptedRecoveryPrivKey снимается дополнительное шифрование. Он преобразуется в ключ RecoveryPrivKey, защищенный ключом RecoveryUnlockKey.
- RecoveryPrivKey сохраняется на устройстве и никогда не синхронизируется в незашифрованном виде. С его помощью, получив из Яндекс ID RecoveryUnlockKey, пользователь сможет сбросить старый мастер-пароль и установить новый.
Ключ, зашифровывающий хранилище паролей.
Открытый ключ. С его помощью зашифровывается ключ EncKey. Хранится в открытом (не зашифрованном) виде.
Закрытый ключ. С его помощью расшифровывается ключ EncKey. Позволяет расшифровать EncKey и пароли пользователя, поэтому защищен парольной фразой. В качестве парольной фразы используется ключ UnlockKey.
Ключ (парольная фраза), с помощью которой зашифрован PrivKey. Результат многократного хеширования мастер-пароля, вычисляется при каждом вводе мастер-пароля.
Мастер-пароль. Пользователь запоминает его и вводит каждый раз, когда нужен доступ к паролям от сайтов.
Копия закрытого ключа для расшифровки EncKey. Используется для сброса мастер-пароля. Хранится на устройстве в зашифрованном виде, для расшифровки необходим RecoveryUnlockKey. Для передачи по сети в процессе синхронизации дополнительно шифруется ключом UnlockKey.
Ключ, зашифровывающий RecoveryPrivKey. Хранится в Яндекс ID.
Копия закрытого ключа RecoveryPrivKey для сброса мастер-пароля, зашифрованная с помощью UnlockKey. Отправляется на сервер для синхронизации с другими устройствами.