LastPass 一次性恢复密码 - 如何?

信息安全 密码 密码管理 AES pbkdf2
2021-09-07 20:10:12

LastPass 密码管理器将一次性恢复密码本地存储在您使用该插件的每个浏览器中:

http://helpdesk.lastpass.com/account-recovery/

我的问题是,你怎么能有多个密码?

我认为 LastPass 使用 PBKDF2 的变体从您的主密码中派生出加密密钥,然后使用 AES 在本地使用此加密密钥加密您的数据。在这种情况下,没有多个密码的空间,除非数据被多次加密。而且,除非它们以某种方式存储在服务器端,否则它们如何启用或禁用 OTP?只是闻起来真的很腥。如果我的数据的加密密钥永远不会离开我的计算机,我无法理解除了我的主密码之外的任何密码如何允许访问我的密码库,除非 LastPass 没有告诉我们某些事情并且本地 Javascript 加密都是烟雾缭绕的。 .

更新

我联系了 LastPass,他们向我指出了这里的解释:http: //forums.lastpass.com/viewtopic.php?f=12&t=22959& p=87289

3个回答

LastPass 在服务器上存储一个“保险库”,它是一个数据集合,使用从“主密码”派生的密钥进行加密。让我们称K为那个键。通常,通过从主密码重新计算K在本地计算机上重建 K。但是,同样的密钥K也可以存储在服务器上,这次使用恢复密钥Kr加密允许知道Kr重建K。“存储在浏览器中的一次性恢复密码”将是K r (他们称它为“密码”,但用户不输入它,因此它可以是一个随机字节的胖序列,通常称为“密钥”)。

使用这样的系统,保险库可以扩展为E K r (K)的“恢复 blob” 。生成恢复 blob 需要知道K,因此它一定发生在客户端系统上,因为 LastPass 不知道K或主密码。这符合一次性恢复密码是特定于浏览器的想法。

如果可以存储一个“恢复 blob”,则也可以存储多个恢复 blob。当用户想要为他的浏览器准备可能的后续恢复时,他让他的浏览器生成一个新的随机K r,将其存储在浏览器内脏中,并计算恢复 blob(用户输入他的主密码,浏览器重新计算K和用K r进行加密)。然后将恢复 blob 发送到 LastPass 的服务器进行存储。LastPass 在任何时候都不会学习K或主密码或任何“一次性恢复密码”。


我上面描述的是一个合理的实现。我不能保证 LastPass 的实际作用。

然而,要指出的一点是“一次性”是纯粹的营销。在我所描述的内容中,本质上没有什么“一次性”。他们的意思是服务器将拒绝多次将给定的恢复 blob 发送回用户。据推测,当用户连接并请求下载恢复 blob 时,LastPass 服务器会将其发回,然后将其销毁。这都与 LastPass 对该数据销毁例程的遵守程度有关。

(系统中不可能有一次性的东西,除非系统的某些部分强制执行一些攻击者无法恢复的状态更改。这是通用的。)

他们可以使用类似于Linux 统一密钥设置(LUKS) 的系统,该系统通常用于在 Linux 下加密 HDD 分区。如您的问题所示,LUKS 通常也与 PBKDF2 和 AES 一起部署。

使用 LUKS,数据在 a 下加密Master Key,然后对每个User Key. 用户密钥由一个或多个生成User Passwords,每个单独存储。这样,您可以使用任何密码来生成主密钥并解密数据。

这一切都在上面链接的 pdf 的“概述”部分中详细解释。

您还可以为不同的人提供不同的密钥并撤销对个人的访问权限,而无需更改任何密钥/密码。

我试图整理有关此功能的各种信息。

“登录 OTP”和“恢复 OTP”有什么区别?

登录 OTP:

可以在此页面上生成登录 OTP 或一次性密码:https ://lastpass.com/otp.php您可以打印这些密码并随身携带。然后可以使用该列表中的每个一次性密码通过https://lastpass.com/otp.php登录 LastPass - 如果您使用的是不受信任的计算机,并且不想输入您的主密码由于键盘记录器威胁,您可以使用 OTP。它在您使用后过期,但允许您在不输入主密码的情况下登录。这些是可移植的,并且不是生成它们的设备本地的。当您在https://lastpass.com/otp.php登录时,可以在任何地方访问该列表,您可以在其中生成和打印更多信息。它们不能用于帐户恢复。

恢复 OTP:

用户无法直接访问恢复 OTP。这些是浏览器插件自动存储的数据位。当您使用 LastPass 浏览器插件时,插件会生成一个从主密码派生的 OTP,并将其存储在浏览器的 LastPass 文件中。它会一直留在那里,直到您在生成和存储 OTP 的特定浏览器中完成帐户恢复。如果您执行恢复过程 ( https://lastpass.com/recover.php ),它将尝试“调用”该 OTP,并在检测到 OTP 存储在浏览器中时允许您立即重置密码。

OTP 对特定浏览器来说是本地的,并且应该在您使用 LastPass 的每台计算机上为每个浏览器生成一个 OTP。恢复 OTP 不可移植,它们存储在特定浏览器的文件中,因此只能在您之前使用过 LastPass 帐户的浏览器上进行恢复。当您在重置主密码后下次登录帐户时,会在您下次登录时为浏览器生成新的 OTP。

*** 注意:所有 OTP 均源自创建帐户时的当前主密码。以任何方式更改主密码,即使是通过还原,也会导致 OTP 无法运行。

来自https://lastpass.com/support.php?cmd=showfaq&id=4616

然后在这个 LastPass 论坛帖子中发布了更多技术细节

...

我们实际做的事情要复杂得多:

  • 创建一个完全随机的 128 位数字
  • 从用户名和随机密码中生成随机密钥作为哈希
  • 使用您的用户名和随机密码进行随机哈希,将其发送到服务器,这将是我们如何告诉您输入了正确的 32 位十六进制数字,以便您稍后下载加密数据
  • 使用新的 random_key 加密您的实际密钥,以便我们以后输入随机密码时可以检索它,并将其发送到服务器

基本上,我们使用随机创建的 128 位密钥来递归整个过程。

这样做的安全性非常高,尤其是当您交出 OTP 时——一个完整的 128 位加密数据密钥,一旦您使用它就会被擦除。

这里有一个小小的遗憾,但它的出现是因为我们需要在时间线上实现它:我们使用相同的 128 位 OTP 进程来存储密码恢复哈希——没有理由不能256 位(甚至更长),因为你没有输入被迫....时间在我们这边。


我希望我现在明白了。为了清楚起见,我将重复一遍:

简而言之(就发送的数据和本地使用的数据而言),当我要求 OTP 时,

  • 随机 OTP 在本地创建
  • temp_key = hash(username + OTP)
  • Username + hash(OTP) 被发送到服务器
  • encrypt(master_password, temp_key) 被发送到服务器

因此,我的主密码、OTP 和 temp_key 都不会发送到服务器。

当我使用 OTP 时,

  • 我输入我的用户名和 OTP
  • Username + hash(OTP) 发送到服务器进行授权
  • 然后你把加密的数据库和 temp_key-encrypted master_password
  • temp_key 从用户名和 OTP 在本地重新创建
  • 主密码在本地解密
  • 数据库在本地解密
  • 您删除已使用的Username + hash(OTP)值,以便此 OTP 不能再用于授权。

所以基本上我们正在处理 OTP 加密的主密码。

这个对吗?然后我不明白如何撤销 OTP。如果您向我发送了 OTP 加密的 master_password,并且我已经在本地输入了 OTP,那么有人在本地机器上进行键盘记录可以保存这两个值并稍后解密 master_password?您将不允许使用相同的 OTP 进行第二次授权,但该人已经获得了主密码!我哪里错了?


不完全 - 尝试以简单的方式将其放入 OTP 创建一个哈希,然后该哈希验证 OTP 在服务器上是否仍然有效,如果是,则允许下载随机数据,然后可以在本地与 OTP 组合(请记住,OTP 不仅仅是散列发送到服务器)来创建您的密钥。

是的,如果您的 OTP 在服务器上有效并且使用时为时已晚 - 您的密钥现在也是本地的 - 但如果您说丢失 OTP 列表,您可以运行到服务器并在此人有机会之前使它们全部失效使用它们。

来自https://forums.lastpass.com/viewtopic.php?f=12&t=22959&p=87289

这有帮助,但 LastPass 似乎没有在这篇文章之后提供明确的实施细节或确认。