“充满密码的文件”很好,但在使用时需要小心。当我和我一起旅行时,我用GnuPG加密它,我只在运行 Linux 的便携式计算机(我的,所以它是“干净的”)上解密它,没有激活任何交换空间,我只在我/tmp配置的 中解密作为tmpfs以 RAM 为后盾的“内存文件系统”( )。练习的目的是防止我的任何宝贵密码进入未加密的永久数据存储(内部硬盘/SSD)。
一些密码管理器应用程序(例如KeePass)可以自动执行此过程并为您提供更易于使用的系统。
另一种方法是在生成密码时切换到数学。这个想法是在你的脑海中存储一个“主密码”(让它很大而且非常随机;比如 20 个随机字母)。当您需要为某些用途U生成密码时,只需应用一些涉及U和主密码的确定性加密操作(例如散列)。“ U ” 这里将是一个使用某种格式(您希望的任何格式)的字符串,它以某种方式对密码的目的地进行编码。
例如,将U设为字符串“ ssh:foo.example.com”以表示“用于通过 SSH 连接到机器的密码foo.example.com”。只要它是明确的,编码就无关紧要,即您可以根据您对情况的了解动态重建字符串(“我想用 SSH 连接到foo.example.com”)并且您不会发生冲突(两种不同的用法结束在相同的使用字符串上)。
将主密码和使用字符串组合成密码的“密码操作”必须谨慎设计。我建议使用PBKDF2,使用字符串U是“盐”。PBKDF2 的迭代计数是一种权衡:较高的计数可以更好地保护您的主密码,但在您想要重新计算密码时意味着更高的成本。大约一百万的迭代成本可能就足够了。
我没有方便地参考这样做的现有产品,但我确信这样的产品存在;并且可以通过简单的 .NET 应用程序轻松地重新实现它(.NET自 .NET 2.0 起就有一个 PBKDF2 的实现,它也可以在 Linux 端口Mono上使用)。
使用数学的重点是你没有任何东西要存储:应用程序(公共的,固定的)和主密码(私人的,从不存储在你脑海中的任何地方)在概念上“包含”几乎无限数量的所有密码的用法。这种解决方案的挑战是:
您需要将 PBKDF2 输出(字节序列)编码为“密码”,这将被认为是“无处不在”可接受的。不幸的是,每个接受密码的站点、服务器或应用程序都可能有自己的限制(最小长度、最大长度、可接受的字符集、不可接受的字符集......),并且不清楚您是否可以设计一个单一的编码导致适用于每个系统的密码。
对于相同的目的地(我们的“使用字符串”),您总是得到相同的密码。某些站点/系统会定期强制更改密码(没有真正合理的原因,但这对您来说是人为的)。您可以通过在“使用字符串”中包含当前日期(月份和年份)来支持此类事情,但是必须记住给定站点是否需要此类轮换密码是很麻烦的。
因此,虽然这种方法有些优雅,但在投入大量思考和修补来创建可以完成这项工作的产品之前,它可能是不切实际的(该产品可以是带有短代码的命令行工具)。
编辑:至于您的更新,一旦您可以存储密码,您就可以随时使用 GnuPG 加密任意文件(使用密码进行对称加密:)gpg -c。因此,您可以以这种方式存储任何内容,包括证书的私钥。