2011年12月21日星期三

开源密码管理生成器

生活中随处要用到密码: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密码了。如果只需要其中的一部分,就是『切出前』选择一个位数,点击>即可。
界面简陋,功能实用,希望您能喜欢。

Posted via email from goldengrape's posterous

没有评论:

发表评论