我经常需要在同一天从我的 Keepass 获取多个密码,我发现自己每次都必须打开它并输入主密码,这非常费力。这个问题的明显解决方案是让它永久打开,但它安全吗?
(我知道我可以“锁定”它,但我仍然必须每次都输入主密码,所以不是很满意的选择)
我经常需要在同一天从我的 Keepass 获取多个密码,我发现自己每次都必须打开它并输入主密码,这非常费力。这个问题的明显解决方案是让它永久打开,但它安全吗?
(我知道我可以“锁定”它,但我仍然必须每次都输入主密码,所以不是很满意的选择)
如果您的计算机不受未经授权的访问,则它是安全的。这包括恶意软件。
如果您的计算机在物理上不安全,那么不,任何人都可以访问您的 Keepass。如果您的计算机上有恶意软件,如果未加密,它也可以访问您的 Keepass。
当您打开它时,它与计算机一样安全,尤其是在您未启用自动锁定的情况下。
它容易受到以下攻击:物理访问恶意软件基本上是任何可以访问您计算机的东西。如果你能阻止那些+一些不太流行的,那是安全的,但如果你不能,我不会冒险
假设您的设备上有恶意软件试图扫描主内存中的敏感数据,不幸的是答案是否定的。
Keepass 提供了一些 针对这种威胁的保护。诚然,它尽最大努力保护您在内存中的密码(但不是您的用户名等):
在 KeePass 运行时,敏感数据会加密存储在进程内存中。这意味着即使您将 KeePass 进程内存转储到磁盘,您也找不到任何敏感数据。出于性能原因,进程内存保护仅适用于敏感数据;此处的敏感数据包括例如主密钥和进入密码,但不包括用户名、注释和文件附件。请注意,这与数据库文件的加密无关;在数据库文件中,所有数据(包括用户名等)都是加密的。
此外,当不再需要时,KeePass 会擦除所有对安全至关重要的内存(如果可能),即在释放这些内存区域之前,它会覆盖这些内存区域。
对于某些操作,KeePass 必须在进程内存中以未加密的方式提供敏感数据。例如,为了在 Windows 提供的标准列表视图控件中显示密码,KeePass 必须将单元格内容(密码)作为未加密的字符串提供(除非启用了使用星号隐藏)。导致进程内存中数据未加密的操作包括但不限于:在标准控件中显示数据(不是星号)、搜索数据、替换占位符(在自动输入期间、拖放、复制到剪贴板,...),导入/导出文件(KDBX 除外)和加载/保存未加密的文件。Windows 和 .NET 可能会复制无法被 KeePass 擦除的数据(在进程内存中)。
Reddit上的一项 2019 年研究(使用 KeePass 2.40)展示了如何将密码不加密地留在内存中。这仅适用于您在打开会话中与之交互的密码,不适用于主密码。显然,在锁定或解锁状态下这个问题的安全性没有区别。(显然,如果您将设备解锁且无人看管,锁定状态仍会阻止人们使用您的 Keepass 文件。)他们得出结论:
最终用户应一如既往地采用安全最佳实践来限制对抗性活动的暴露,例如:
(...)
- 即使处于锁定状态也不使用密码管理器时完全关闭密码管理器(如果使用的密码管理器在被置于锁定运行状态时不能正确清理机密)
但是,只有在您的设备上存在恶意软件时才会存在威胁。因此,也可能是恶意软件
因此,问题仍然存在,始终关闭(不仅仅是锁定!)Keepass 的习惯在实践中真正提供了多少额外的安全性。
作为在安全性和便利性之间进行权衡的一个想法,您可以使用两个 Keepass 文件:一个您会尽快关闭,用于存储超级敏感数据,例如电子邮件登录、银行登录、加密资产密钥等;另一个您长时间保持打开状态,用于处理不太敏感的数据,例如留言板登录等。
免责声明:我不是安全专家,只是专业的软件开发人员。