取一个变量很纠结,取一个密码很头痛。于是,我开始使用自己的随机密码器,并且它还是“云同步”的。
而出于以下的背景:
10 年前我使用一个固定的、统一的密码,直到一系列的明文密码泄露事件,我在不同的平台采用了不同的密码。
在经历了一系列的忘记密码之后,我开始采用平台限定的密码,即不同的平台,密码是半动态的。
现今的大部分重要网站都采用了二次验证,或是 Google Authenticator,或是短信验证。
在 ThoughtWorks,我们的密码需要每三个月换一次,它足够的长,并且有一系列的复杂规则。
于是,我终于编写了自己的随机密码器,然后它也是“云同步”的。
统一密码
大家都懂的。。。
如果你的所有账号只有一个密码,那么你完了。。。
最好不要拍些艳照什么的。
快速密码:解锁电脑
当我还在使用 Windows 时,从来就没有想过,可以拥有这样的一个密码:
1qaz2wsx
它在输入上特别快速,并且解锁起来又特别的快。
因为,对应于键盘上的:按键。它有一些变体,比如说:
1234qwer
又或者是:
1qaz@WSX
也会有一些其它高级的变体。
特定平台 + 固定密码
10 年前我使用一个固定的、统一的密码,直到一系列的明文密码泄露事件,我在不同的平台采用了不同的密码。在经历了一系列的忘记密码之后,我开始采用平台限定的密码,即不同的平台,密码是半动态的。如下就是一个简单的,对应于不同平台的代码体系,如:
京东:
tb-1qaz2wsx
淘宝:
jd-1qaz2wsx
而这样的密码本身也是不安全的,如果有人知道密码规则的话。那么,这无异于一场灾难。于是,我在设计出规则到现在,仅会在一些重要的网站上,采用这种规则。
使用密码管理器
在几年前,我初次接触到了密码管理:LastPass、1Password——对于普通用户来说,它们是一个相当不错的工具。1Password 可以使用 iCloud 同步,可惜我是个 Android 用户。因此,一旦需要我输入密码到手机的时候,就变得有点可怕。并且 1Password 也有对应的 Chrome 插件,可是 Chrome 的自动填充是另外一个问题——所以,尽量不要把电脑借给别人。
然而,1Password 和 LastPass 的密码策略,让我觉得它也是不可靠的——Master Password,也就是一个密码可以解锁其它密码。
特定平台 + 生成密码
考虑到上面的密码在固定部分是不安全的,我便想到了一种更优雅的方式:基于 Git 的 SHA-1 算法生成的 commit 号,来实现:特定平台 + 生成密码。如下是一个 git log
的示例:
commit b40c83cb772d4b496d1f9ecec136e21d46f6a765 Author: Phodal HUANG <h@phodal.com>Date: Tue Mar 13 17:00:11 2018 +0800 [mooa] log: add basic logiccommit 3c8badf0bd6671368910fb22eada5a850a3fcf88 Author: Phodal HUANG <h@phodal.com>Date: Tue Mar 13 16:46:53 2018 +0800 [mooa] rename staus filter to status helper
其中的:commit b40c83cb772d4b496d1f9ecec136e21d46f6a765
,即对应了一个随机密码。于是我们的密码就变成了:
京东:
tb-b40c83cb
淘宝:
jd-3c8badf0
当然了 btoa('jingdong')
,也是一个不错的实践:amluZ2Rvbmc=
。
作为一个程序员,最后我采用的策略是,半动态的密码 + 生成的密码。
代码生成密码 + GitHub 存储密码
虽然,我不知道怎么样的密码是真的安全的,但是我觉得一个二十位左右的密码就是安全的。于是我编写了一个七行的 Python 脚本来生成一个 12 位的密码:
from random import choicefrom string import hexdigits, punctuationimport time base_time = str(time.time())[12:16] base_string = ''.join(choice(hexdigits) for i in range(6)) base_punctuation = ''.join(choice(punctuation) for j in range(2)) print(base_string + base_punctuation + base_time)
首先,生成器将从时间戳里,取第 12~16 位的字符,如下:
1520944501.967865
接着,生成器将从十六进制数字中,随机取 6 位:
0123456789abcdefABCDEF
最后,再从所有的特殊字符中取出几个字符:
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
就有了这部分的密码:
09a86a{#4242
PS:我使用的是 Python 3,你们这些 Python 2.6 的异教徒。
最后,需要有一个地方来同步我的密码,于是,我将密码存储在了 GitHub 上了——我的 GitHub 需要二次验证。
结论
最后,请不到你的密码贴在笔记本上。