我的密码管理策略

[ 本文来自于我的知乎回答,现整理修改后记于博客。]

随着互联网时代的发展,世界上的每个个体与互联网的关系也变得愈发紧密,而移动互联网更是极大的促进了这种趋势——一部手机,世界就在你手中。

伴随着这种趋势而来的,是个人对于互联网应用的依赖激增,每个人每天几乎同时使用着几十款互联网应用,如何管理这些互联网应用的个人密码并保证足够的安全性变得重要起来。

本文介绍一下我的密码管理策略。

需求

有人可能会直接推荐使用一些密码管理工具(比如 1Password、LastPass 等)来管理自己的密码,但我不打算采用。任何工具在将来都存在不可靠的可能,但自己的大脑却是值得信赖的。

如果用做一款互联网产品的思维来思考,首先这套策略应该是对用户友好的(人脑可兼容的),但同时又必需在日益复杂的互联网环境中具有足够的强度。

列出的需求如下:

  • 强度足够;
  • 易于记忆、输入方便;
  • 方便生成与定期更换;
  • 不借助密码管理工具,任何工具都不一定可靠;
  • 不同应用的密码应该不一样,不把鸡蛋放一个篮子里;
  • 加入随机因子(或伪随机因子);
  • 密码中无个人永久信息;

其实这就是如何在方便和复杂这种天然的矛盾中找出人脑可记忆的那个平衡点。

策略细节

依据这样的需求,我构思了这样一种方案:

构造基础字串:应用特征信息 + 私钥

  1. 应用特征信息:

    由于需要每个应用密码都不同,而且自己又要记得住(或者可根据一定规则推算出来),所以基础字串中一定要有应用的特征信息,可以是 URL 的某一部分、应用名,甚至是页面源代码的倒数第五个非 html 元素等等。

    总之这个信息应该至少具备两个特点:基本不会变化 + 规则固定(最好是一眼就可以看出来的,取决于自己决定的规则)。

  2. 私钥(或者说 salt):

    我决定用一段时间内自己特别关注的某个点来定义私钥,由于这个信息可能是自己在这一段时间内特别关注的,所以一般也不会忘记。

    这个的灵感来源于这个答案:用什么方式记密码最好? - 匿名用户的回答。你也可以根据这个答案的内容来确定自己某一段时间内的私钥。

    注意:由于私钥过一段时间更换一次,所以密码随着私钥更新也要更新(稍后会讲维护方法),这相当于添加的一些与应用无关的随机因素,而别人一般也不可能猜到。

基础字串由应用特征信息和私钥组合而成,至于组合规则你可以简单拼接,或是更复杂的交叉拼接都可。不过这里还是建议简单点设计,便于记住。

编码

在基础字串的基础上,根据一些替换、交换次序等特有规则进行编码,灵感来源于 @吴涛 的这个回答:如何管理好自己的密码? - 吴涛的回答。这样的规则也不宜过多,总之以自己能方便记住和输入为原则。

一旦你的规则确定下来,这样就生成了你的某一个应用的唯一密码。

具体实践

对于具体实践,我还设计了这样的维护方案:

根据规则写成脚本

如果会编程可以把以上自己确定下来的规则写成脚本,方便自己在电脑上使用时不用多想一键生成密码(注意脚本中是不记录你提取出的应用特征信息和私钥的,所以即便脚本不小心被别人拿走也不知道你构建基础字串的方法)。

但是,写脚本并不是为了让你总是依赖它来生成你的密码进行登录,你应该总是能够在短时间内根据自己设定的规则在脑中生成密码

脚本存在的最大的意义在于:注册时尽量使用脚本生成的密码,避免你自己确定的密码生成规则存在歧义的情况下导致以后的自己会生成不一样的密码而无法登录,因为代码是不存在二义性的(无随机语句类似的情况时),这可以为以后确定密码提供一个依据。

所以如果你不会脚本也没有关系,只要你保证自己设定的规则没有歧义就可以了。

维护一个有两个列表的文本文件

  • 列表一是你或常用或重要的应用列表,如果是网站就记录网址,如果是应用就记录名字等等。

    在这个列表中的所有应用,都是你的核心应用,并且网站开发者具有一定的技术实力,至少它的密码加密方式一定不是很随意可破解的。

    对于这些应用,私钥绝对要使用你的最新私钥。注意这个私钥不要记录下来,而应该是你在这段时间内一定不会忘记的某些信息,这样即便这个文本被泄露别人还是不知道你的最新的私钥(以及密码生成规则)。

    这个列表也可帮助你在更新私钥之后有次序的依次更新这个列表中应用的密码。

  • 列表二是一些不重要或技术水平存疑的网站,比如学校网站、政府网站等等,这样的网站或应用不仅需要记录它的 URL 或者名字,还应该记录一个注册时采用的私钥。也就是说,这些应用的私钥不是最新的,而且密码也一般是永远不会改变的。

    这样做的原因在于,如果这些技术水平存疑或者故意使坏的网站对于你的密码没有加密或加密可轻易破解,这样在类似于拖库之后你的私钥和密码生成规则很可能都会被猜到,如此便极有可能影响到那些对你而言重要的网站或应用,那样你就不得不更换算法了。所以这里采用过时的私钥,相当于加筑一道防火墙。

    (如果这里觉得麻烦,也可以简单的对这些不重要的网站采用同一个密码。不过最好还是按上述做法。

即便这个文本文件泄漏,别人也不会知道你的密码生成规则、基础字串的构建方法和最新的私钥。

总结

最后,总结一下,你需要做的:

  1. 记住:密码生成规则(使用几遍就可记住)+ 最新的私钥;

  2. 把脚本和本地的文本文件做好备份,可以备份到多个硬盘、U盘或者你绝对信得过的云盘。

    不过即便你的这俩文件都丢失了,你依然可以凭最新的私钥生成密码,所以那些重要的应用依然不受影响。并且你可以在浏览器中对这些网站添加书签并云备份,所以你的重要列表也不会丢,但可能不重要列表中那些年代久远的密码就找不回了。不过既然不重要,那又能怎样呢?

目前这套方案我已经稳定使用了很久了,有人可能觉得规则过于复杂难以记住,实际上我在规则确定的第二天就能稳定快速的对任一款应用生成自己的密码。而且你使用的次数越多,记忆会越来越深刻,也会越来越不容易出错,是个正反馈良性循环。

同时祝你使用愉快。