一个密码生成程序

原文:http://genghis-yang.tk/?p=97

本篇算是上一篇的续集,上次说了中国各大网站密码泄露事件,对于我这种各个网站密码都是一样的人,泄露一个网站可算是把所有网站密码全泄露了。所以 写了这么个小程序,目的是:只要记住一个主密码,然后由程序帮你为每个网站生成不同密码,当你需要登录时只要在此程序中再次输入你的主密码,就可以得到密 码了。看图:

其 实这个程序思路很简单,就是把网站域名和你的主密码混合在一起。然后用windows xp系统中自带加密库Cryptdll.dll,使用其中MD5算法加密。加密之后得到一个128bit结果,利用一个字典和这个结果产生适当长度的密 码。本想也放到Google Code上去,但想想这个太简单,又没什么实用性也就作罢。

说说我这个程序吧,希望可以抛砖引玉。

我 是用VS2010建了个MFC-Dialog程序,只加了几个控件和处理函数。这里最值得一提的是我使用了Cryptdll.dll中的MD5算法(如果 要最大程度保证安全性还是需要自己写一个单向散列函数),这个算法共3个函数:MD5Init,MD5Update,MD5Final,依次使用就可以得 到结果。不过这几个函数是没有对应头文件的,要想使用必须用LoadLibrary或者GetProcAddress函数从动态链接库中加载。具体的用法 可以看看MSDN上Message Digest页面的例子,我基本上就Copy这个。

得 到的128bit结果是用unsigned char数组表示的,也就是16个元素。这写元素值是不确定的(很可能是非字符),不能直接用来当密码。我们需要把这16个元素转换成可以显示的字符串。 我的方法是建立一个字典,此字典相当于一个"密码可用字符列表",所有希望在密码中出现的字符都列在里面(我的字典仅包含数字和大小写字母)。然后用之前 16个元素中每个元素对字典长度取余,取余的结果作为索引,将此元素转换成的对应于字典中的字符。这样循环16次我们就得到了一个16个字符的密码了,而 且它随机使用字典中的字符,基本不会出现有意义的字符串,保密性良好。

可执行程序:点此下载

源代码:点此下载

我这个程序没花心思,写得很简单,其实很多方面可以做得更人性化。例如能够自动检测所访问网站的域名,自动填写域名一栏,那就方便多了。


发表评论