Você parece curioso especificamente sobre a chave usada para criptografar as senhas no Chrome.
A resposta é:
Every password is encrypted with a different random key.
E a senha criptografada é armazenada no arquivo de banco de dados SQLite:
%LocalAppData%\Google\Chrome\User Data\Default\Login Data
Você pode usar algo como Navegador de banco de dados SQLite ou SQLite Maestro para visualizá-lo. Aqui está um trecho do meu arquivo Login Data
:
origin_url username_value password_value
======================================== ============== ========================
http://thepiratebay.org/register [email protected] 01000000D08C9DDF0115D1118C7A00C04FC297EB01000000BB0E1F4548ADC84A82EC0873552BCB460000000002000000000003660000C0000000100000006811169334524F33D880DE0C842B9BBB0000000004800000A00000001000000043C8E23979F5CC5499D73610B969A92A08000000EE07953DEC9F7CA01400000098B5F0F01E35B0DC6BBAFC53A9B1254AC999F4FA
Você notará que a senha é um blob criptografado de dados. O algoritmo aproximado para criptografar uma nova senha é:
- gera uma nova chave de sessão aleatória
- criptografa a senha com a chave da sessão
- criptografa a chave de sessão com a chave pública RSA do usuário
- gera um Código de Autenticação de Mensagem (HMAC) para os dados criptografados
- concatena a chave de sessão criptografada, a senha criptografada e o MAC
E o Chrome salva esse blob em seu banco de dados SQLite.
Mas, para responder à sua pergunta: De onde vem a chave de criptografia?
Each password is encrypted with a different randomly generated key
Os detalhes técnicos
Claro que deixei de fora os detalhes técnicos. O Chrome não criptografa suas próprias senhas. O Chrome não tem uma chave mestra usada para criptografar nada. O Chrome não faz a criptografia. O Windows faz.
Existe uma função do Windows, CryptProtectData
, que é usada para criptografar dados arbitrários de que você gosta. Os detalhes de chamá-lo são menos importantes. Mas se eu inventar uma pseudo-linguagem que pode ser decifrável como qualquer linguagem de programação, o Chrome chama:
CryptProtectData(
{ cbData: 28, pbData: "correct battery horse staple" },
"The password for superuser.com and all the glee therein",
null, //optional entropy
null, //reserved
null, //prompt options
0, //flags
{ cbData: pbData: }); //where the encrypted data will go
Então a senha:
-
Texto simples :
correct battery horse staple
-
Criptografado :
01000000D08C9DDF0115D1118C7A00C04FC297EB01000000BB0E1F4548ADC84A82EC0873552BCB460000000002000000000003660000C0000000100000006811169334524F33D880DE0C842B9BBB0000000004800000A00000001000000043C8E23979F5CC5499D73610B969A92A08000000EE07953DEC9F7CA01400000098B5F0F01E35B0DC6BBAFC53A9B1254AC999F4FA
Você notará que nunca precisei fornecer uma senha. Isso é porque o Windows cuida de tudo isso. No final:
- uma senha aleatória é gerada para criptografar a senha
- essa senha é criptografada com uma senha aleatória
- essa senha é criptografada com sua senha do Windows
Assim, a única maneira de alguém saber sua senha é se ela souber sua senha.