星期日, 十二月 25, 2011

开源密码管理生成器



生活中随处要用到密码:ATM机上取钱,微博登陆,邮箱登陆……在这个信息时代,其实真正能代表你的恐怕只有你的密码了。安全性最低的方法,就是用统一的一个密码来登陆所有这些,算是一了百了,只要记住一个密码就足够了,但是只要有一个密码被人破解,你所有的身份、金钱也就可能随之给了别人。我们需要不同的密码,用在不同的地方,甚至某些网站要求定期修改密码,于是我们就要记住越来越多的密码
对于年纪大些的人,可能会用一个密码记录簿来记录这些密码。威胁也是存在的,如果密码记录簿丢失了,那么所有的密码也就丢失了,或者需要用某个密码的时候,恰好记录簿没有带在身边,也就无法回忆起那个密码
比物理的密码记录簿更优秀的方法,是设计一个主密码,然后利用某些规则生成许多子密码应用在不同的网站上,比如主密码是“一枝红杏出墙来”,那么在微博上子密码可能就是“一枝红杏出微博”,新浪上子密码可能是“一枝红杏出网易”,Gtalk上子密码则变成了“一枝红杏出QQ”之类的。这种方法也有几个问题:
1. 如果从主密码到子密码的规则太简单,那么一个子密码被破解,有可能逆向推出主密码,然后所有密码也随之被破解。
2. 如果从主密码到子密码的规则太复杂,则又出现了新的记忆难度
3. 对于银行卡和ATM机之类只支持数字密码的,需要另一组生成规则
比生成子密码更好的方式,是密码管理软件或者网站。用一个主密码进入密码管理软件,所有的子密码是由软件随机生成的,其中任何一个子密码被破解,也不影响其他子密码,也不会被逆向破解出主密码。但密码管理软件的弊端和纸质的密码簿由相似之处,就是一旦接触不到软件或网站,自己也很难想起密码来。
理想的密码管理方式是:
1. 开源的。密码管理软件如果是闭源的,风险就很大。谁知道会不会有哪个无良程序员在软件中设置后门,将你所有的密码都记录并且传递到某个地方去。
2. 跨平台。你可能有一台PC,一台Macbook笔记本,一只Android手机,还有一个kindle电子书。这些设备都需要能够产生/调用你的子密码
3. 在线/离线方式共存。在线的网站通常是等价于跨平台,比如lastpass就是一个不错的在线记录密码的网站,虽然它并不满足开源的要求。但是网站总有一个是否能够接触到的问题,比如你站在一台位于地下商业街的ATM机面前,连个手机信号都没有,任凭lastpass如何在云端,你也无法接触到了。
4. 子密码不可逆向推出主密码。子密码之间无法互相推知。这一点成熟的密码管理软件都可以做到。
5. 同时可以管理字符和数字型的密码
综上,我想出了一种密码管理生成的方式,如下。
密码=MD5(主密码+应用名+版本号)
例如,主密码是“12345”,应用在微博上,第0号版本。子密码=MD5(12345+weibo+0),那么使用16进制的MD5数值作为字符型的密码,而使用整数型的,作为数值型密码:
 integer form | 125005476443167096316531531755775625670
 hexadecimal form | 5e0b 2dd4 df66 07a9 af36 7b41 6c48 89c6
不过实际中用不了这么长的密码,可以只使用前8位"5e0b2dd4"作为密码
密码是应该定期更换的,比如3个月更换一次。于是下一次更换时,用MD5(12345+weibo+1),密码变成了:
 integer form | 48819798530286427763212232259863620227
 hexadecimal form | 24ba 59e7 6185 ba3e d70b 865f 94f8 aa83
如果是用在银行卡上,比如工商银行,那么生成的是MD5(12345+icbc+0),密码是:
 integer form | 140350455243536382853078667013757626879
 hexadecimal form | 6996 83b2 bedc b85b 4d38 a837 7584 69ff
考虑到ATM机只认6位数字,密码是140350
MD5,Message-Digest Algorithm 5(信息-摘要算法 5),是广泛使用的散列算法之一,能够将数据运算为另一固定长度值。
MD5对输入序列非常敏感,有一点点的差异,就可以产生出完全不同的MD5值,比如上述的MD5(12345+weibo+0)、MD5(12345+weibo+1)、MD5(12345+icbc+0),所产生的数值就完全不同。所以你的子密码看起来根本没有什么相关性,从MD5值逆向推导出MD5函数的输入值是非常困难的。这个难度和破解现在银行使用的计算机系统的难度相当。因此即使你不慎丢失了一枚子密码,其他的子密码仍然是安全的。
MD5的算法是公开的,有很多软件可以计算。你可以下载一个计算md5的工具来作为自己的密码管理生成器。因为MD5的用途实在太多,因此在windows/
Mac OS/ iOS/ Symbian/ Android/ WebOS下一定都会有大把的计算软件可供使用。
如果不相信别人的软件,你也可以自己来写,比如在Mac、linux上,可以直接在终端中输入
md5 -s "12345+weibo+0"
就可以得出5e0b 2dd4 df66 07a9 af36 7b41 6c48 89c6的答案。在python上也就是一行代码:
import md5; md5.md5("12345+weibo+0").hexdigest()
如果懒得动手,也有云端版的MD5计算器。到https://wolframalpha.com/ 上输入md5
12345+weibo+0,就可以计算出数值了,同时返回整数型和16进制型的。更厉害的,在手机上,用任意浏览器访问https://m.wolframalpha.com
也有同样的效果。不过注意,wolframalpha的搜索字符串是直接作为明文提交到网站上的,如果在网络路途中,有什么人监听的话,可能会丢失你的主密码哦,一旦主密码失窃,你所有的密码也就都丢了。所以最好还是通过本地运算比较好。

最后,介绍下我们(我,@chenxiaoqino @Hjin_me)制作的一个MD5密码生成器:http://code.google.com/p/md5-password-creator/
第一个输入框中填写您的主密码。
第二个输入框中填写您需要的应用名或者网站名称
点击MD5!以后就可以算出您的MD5密码了。如果只需要其中的一部分,就是『切出前』选择一个位数,点击>即可。
界面简陋,功能实用,希望您能喜欢。

没有评论: