评论四处乱跳,让人很难看清整体。而不是玩打地鼠,这里是一个总结。
首先,让我们记住,任何密码方案都必须改进最佳实践。最佳实践是使用具有良好密码生成器的良好密码管理器。
我们还要记住,安全性的强弱取决于其最薄弱的环节。如果我能从窗户进去,不管你的门有多棒。任何一个弱点都会使整个方案无效。必须解决所有弱点。
最后,系统的安全性不是作为一种理想来评估的,而是它是如何被实际使用的。OP 的问题提出了一个理想,但在评论和编辑过程中,我们发现它在实践中的使用方式截然不同。
密码的强度与密钥一样强,每个密码都会将密钥暴露给攻击。
该系统的主要缺陷是每个密码都将密钥暴露给攻击,所有密码的强度取决于暴力破解密钥的难度。
要暴力破解密钥,需要密码、盐、前缀和过程。
您无法控制密码的安全性,必须假设它们会泄漏。根据设计,盐很容易猜到。可以通过比较多个密码来发现前缀。Kerckhoffs 的原则说我们必须假设该过程是公开的。
选择不合适的哈希算法会使暴力破解变得比应有的更容易。而且,正如我们将看到的,一旦你开始制作密码,修复起来就会变得越来越困难。同样,密钥不能改变;你被一个越来越弱的键困住了。
密码管理器没有这些缺陷。
理想与实践
该方案的理想版本对其可用性提出了这些要求。
- 一个人只需要记住钥匙。
- 它是无国籍的,不需要写下来。
- 选择盐的过程简单易记。
- 不需要信任第三方。
- 它可以处理“我所有的在线密码”。
这些在实践中是站不住脚的。
- 需要记住两件事,键和前缀。
- 写下盐和前缀是因为...
- 极端情况意味着加盐很复杂,需要多个前缀。
- 人们可以选择使用密钥、前缀和密码来信任不安全的服务。
- 它无法在不影响安全性和可用性的情况下处理所有在线密码。
相比之下,一个好的密码管理器...
- 只需要记住主密码。
- 有状态,但都是加密的。
- 没有要记住的算法。
- 由专业人员审核。
- 可以处理所有的秘密。
用户必须做出太多重要的决定。
用户必须选择散列算法、散列方法、密钥、前缀和盐程序。所有这些都会影响可用性和安全性。这些都不应该由用户进行。
例如,OP 选择了不合适的哈希算法,使得暴力破解密钥更容易。他们使用不受信任的站点进行散列处理,暴露所有内容。他们的加盐过程不足以涵盖所有需要写下一些服务名称而降低可用性的情况。所选前缀可能不足以涵盖所有密码要求。
该方案可以通过让专业人员为用户推荐选择来改进,但用户仍然可以忽略它们。
一个好的密码管理器没有这些缺陷。整个过程由专业人员创建,不断审查和改进,并由软件处理。
糟糕的选择是无法解决的。
在这个方案中,一个密码依赖于四个部分。
更改其中任何一项,所有密码都必须更改。这使得系统非常脆弱,并对安全性和可用性产生许多影响。
不用说,一个好的密码管理器没有这些缺陷。
对于其余部分,为简洁起见,当我说“它无法更改”时,请阅读“如果不更改所有密码就无法更改”。如果更改很困难,用户很可能会对其安全性做出妥协。
哈希算法无法更改。
如果一个弱点暴露出来,能够改变你的哈希算法是很重要的。一个好的系统将能够悄悄地为未来的密码交换更好的算法。
SHA-512 是一个不合适的选择,它更容易暴力破解已经过度暴露的密钥。
密码管理器会为您处理这个问题。
密钥将越来越受到损害。
虽然强制密码轮换已经过时,但它仍然是一个安全基石,您需要能够在任何怀疑被泄露时更改您的密钥。过程越简单,您就越有可能在任何提示漏洞的情况下使用新密钥。
如果您选择了弱键,则无法选择更好的键。随着计算能力变得更强,您将需要更强大的密钥。
使用密码管理器,您可以根据需要随时更改主密码。
腌制过程将是不充分的。
为了避免写下盐,为服务获取盐的过程必须足够灵活以适应所有情况,但又要简单到可以记住并在您的脑海中完成。
用户很可能会选择一个简单的方案并发现它越来越不够用。这里有几个角落案例......
- github.com 是“Github”还是“GitHub?
- 如果 foo.com 是“Foo”,那么 foo.us 是什么?
- 你如何存储 foo.github.io?
- 你会意识到 foo.io 曾经是 foo.github.io 吗?
该程序无法预测所有情况,或者它非常复杂,无法在您的脑海中可靠地完成。不可避免的结果是必须写下一些服务名称,从而降低可用性和安全性。
加盐过程也可能随着时间的推移而漂移,因为它被巧妙地改变以适应更多的边缘情况。它可能与旧密码不兼容。
密码管理器不需要这样的过程。
一个前缀并不适合所有。
虽然密码策略最终会消失,但它们仍然存在,而且它们通常是荒谬和矛盾的。使用此方案,必须预先选择一个涵盖所有可能情况的前缀。这不太可能,也许是不可能的。
边缘案例只需要一个站点的特殊前缀,要求将它们写下来,从而降低可用性和安全性。
一个好的密码生成器可以适应大多数策略。如果没有,您可以手动更改生成的密码。
它不能安全地共享。
比方说,我想要一组共享的密码。也许是为了工作、一个项目或与家人。
有了一个好的密码管理器,我可以创建三级密钥,分发它们,最重要的是,撤销它们。可以通过云或简单地复制它来提供保险库。我可以创建共享保管库并选择共享哪些密码。
使用这种方案,必须共享密钥、前缀、哈希算法,并解释加盐过程。接收者必须愿意跳过该系统独有的所有这些障碍。这些都不能撤销。所有密码都会被公开,包括未来的密码。如果一个人泄露了密钥或前缀,那么一切都会被泄露。如果您只想共享特定密码,您需要想出并记住新的密钥和前缀,并记住使用哪个密钥和前缀生成的密码。
难以备份。
可以将密钥和前缀以及特殊的盐和哈希算法存储在安全的位置。但是,人们还必须写下对日益复杂的腌制过程的准确描述。任何阅读文档的人都知道这是多么困难。
使用好的密码管理器,可以将保管库密钥存储在安全位置并备份保管库。由于保管库已加密,因此可以在任何地方进行备份。
这种基于哈希的个人密码方案有多安全?
它比重复使用几个容易记住的密码更安全。与一个好的密码管理器和随机生成的密码相比,它更难使用,功能更少,安全性也更低。
如果您对商业软件过敏,请使用开源软件。如果您不信任云存储,请将保管库存储在本地。如果您希望它可以在任何地方使用,请将保管库和软件存储在钥匙圈上的拇指驱动器上。