Google Chrome 如何存储密码?

Ósc*_*car 32 encryption password-management google-chrome passwords

它们是否在磁盘中加密?如何?例如,如果有人从 Live CD 启动并安装硬盘,它们是否安全?

加密密钥是如何生成的?Windows 和 Linux 有什么不同?

Ian*_*oyd 32

您似乎特别对用于在 Chrome 中加密密码的密钥感到好奇。

答案是:

每个密码都使用不同的随机密钥加密。

然后将加密后的密码存储在 SQLite 数据库文件中:

%LocalAppData%\Google\Chrome\User Data\Default\Login Data
Run Code Online (Sandbox Code Playgroud)

您可以使用SQLite Database BrowserSQLite Maestro 之类的工具来查看它。这是我的Login Data文件中的一个片段:

origin_url                                username_value               password_value
========================================  ==============               ========================
http://thepiratebay.org/register          JolineBlomqvist@example.com  01000000D08C9DDF0115D1118C7A00C04FC297EB01000000BB0E1F4548ADC84A82EC0873552BCB460000000002000000000003660000C0000000100000006811169334524F33D880DE0C842B9BBB0000000004800000A00000001000000043C8E23979F5CC5499D73610B969A92A08000000EE07953DEC9F7CA01400000098B5F0F01E35B0DC6BBAFC53A9B1254AC999F4FA
Run Code Online (Sandbox Code Playgroud)

您会注意到密码是加密的数据块。加密新密码的近似算法是:

  • 生成一个新的随机会话密钥
  • 使用会话密钥加密密码
  • 使用用户的 RSA 公钥加密会话密钥
  • 为加密数据生成消息验证码 (HMAC)
  • 连接加密的会话密钥、加密的密码和 MAC

Chrome 会将该 blob 保存到其 SQLite 数据库中。

但是要回答您的问题:加密密钥从何而来?

每个密码都使用不同的随机生成的密钥加密

技术细节

当然,我遗漏了技术细节。Chrome 本身不会加密您的密码。Chrome 没有用于加密任何内容的主密钥。Chrome 不进行加密。Windows 可以。

有一个 Windows 函数,CryptProtectData用于加密您喜欢的任意数据。调用它的细节不太重要。但是,如果我发明了一种伪语言,它在某种程度上可以像任何编程语言一样被解读,Chrome 会调用:

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
Run Code Online (Sandbox Code Playgroud)

所以密码:

  • 明文correct battery horse staple
  • 加密01000000D08C9DDF0115D1118C7A00C04FC297EB01000000BB0E1F4548ADC84A82EC0873552BCB460000000002000000000003660000C0000000100000006811169334524F33D880DE0C842B9BBB0000000004800000A00000001000000043C8E23979F5CC5499D73610B969A92A08000000EE07953DEC9F7CA01400000098B5F0F01E35B0DC6BBAFC53A9B1254AC999F4FA

你会注意到我从来不需要提供密码。那是因为 Windows 负责所有这些。到底:

  • 生成随机密码对密码进行加密
  • 该密码是用随机密码加密的
  • 该密码是用您的 Windows 密码加密的

因此,某人知道您的密码的唯一方法是他们是否知道您的密码。

  • @brunoais Chrome 不知道用于加密密码的密钥。Chrome 不会解密它们 - Windows 会。 (2认同)
  • @brunoais 仅当您输入密码时。不幸的是,这是加密的一个基本限制:一旦数据被解密,它就会被解密。 (2认同)

sbl*_*air 10

密码被加密并存储在 SQLite 数据库中:

这里的重要部分是CryptProtectData,它是一个用于加密数据的 Windows API 函数。使用此功能加密的数据非常可靠。它只能在同一台机器上由最初加密它的同一用户解密。

  • @Óscar:在 Linux 上,`Encryptor::EncryptString` [不做任何事情](http://code.google.com/p/chromium/issues/detail?id=25404)。似乎有使用 GNOME Keyring 和 KDE Wallet 的代码。 (3认同)

Pyl*_*lsa 3

它们是“加密的”,但它是可逆的加密。Chrome 必须将原始密码发送到存储密码的网站,因此如果 Chrome 可以解密并使用它,其他人也可以。存储密码永远不是 100% 安全的。

  • 检查 sblair 的答案。请注意,无论如何存储,都有可能被解密。使用适当的软件,任何人都可以解密它。当您登录 Windows 帐户直至注销时,您的密码完全可用且完全可见。只是表明没有 100% 安全的存储浏览器密码的解决方案。 (2认同)