可以从主密码安全地派生特定于站点的密码。它需要一个确定性的单向函数:“确定性”,以便可以重新计算站点密码,“单向”,以便从特定于站点的密码重新计算主密码是不可行的。作为一阶近似,密码散列函数可以解决问题。
可以通过使密码派生(从主密码到特定于站点的密码)可配置地缓慢来增强系统,以避免有效的字典攻击(邪恶的网站可以“尝试”潜在的主密码,以查看它是否获得了您使用的密码)。“慢散列”是具有多次迭代的散列。您还可以添加盐:一段不是秘密的数据,但随机选择,以便您的主站点密码软件的两个不同用户在碰巧使用相同的站点密码时不会最终使用相同的站点密码主密码。盐可以存储在一个文件中(它们不是秘密的),但这会阻止您仅根据您对主密码的了解来重建所有特定于站点的密码(即记忆问题,您正在添加数据备份的问题)。
这与存储服务器端密码哈希的问题非常相似(通常的解决方案是bcrypt和PBKDF2)。主密码为“master”使问题变得更容易。既然你只需要记住一个密码,你不妨把它做成一个大的、胖的、随机的、高熵的密码。生成一个由 17 个随机小写字母组成的序列,学习它,你会没事的(因为 26 17大约是 2 80,并且调用 2 80次哈希函数超出了当前技术的可行性)。全小写字母密码易于输入,尤其是在智能手机上。
其他人已经指出了现有的软件就是这样做的。
您使用 RSA 密钥和加密随机密码的想法也有效。但是,它意味着存储。如果您正在旅行并且有人偷了您的笔记本电脑(不幸但并非完全不可信的事件),那么您不仅会被剥夺机器,而且还会丢失密码,直到您购买新机器并检索加密的备份文件充满密码。这可能很不方便。从主密码确定性地派生密码意味着您在记住主密码时不会丢失它们。
此外,任何新密码(用于新站点)都需要修改文件及其备份,这在旅行时可能会遇到一些困难。
使用中间存储允许密码更新,但你为什么要这样做呢?当您管理一个拥有数百个密码的大型组织并且您认为某些密码会很弱,而某些密码会被破解时,密码更新很有用。这是一种遏制损害的方法,并且只有在始终存在非零比例的破解密码时才有意义。密码更新是野战军的事情。它不会缩小:当您使用单个主密码(您的情况)时,该密码要么完全没有损坏,要么完全损坏。前一种情况,无需更新主密码;在后者中,您有更紧迫的问题需要处理,包括更改您以前所有特定于站点的密码。
简而言之:如果您的主密码需要更新,那么它已被破坏;这意味着您的所有站点密码都是吐司。因此,在不更改站点密码的情况下更新主密码是没有用的。