现在好多人不想在每个网站都使用相同密码,他们又无法记住所有网站的密码。
本文提供一个简单的方式让大家可以轻松记住一个账户和密码,来得到对每个不同的网站有一个对应的密码。
本文还发在我自己搭建的博客: 生成密码,因为csdn的文章更新没有自己博客简单,所以如果想看更新的文章,请到我的博客去看。
当然自己的博客是放草稿的,如果文章写好了,我才发到csdn
这是一个生成密码算法。
首先是要求用户输入他要记住的账号和密码。
然后用户对他每个需要生成密码的网站,在程序输入域名。
接着就是选择生成的密码,有需要位数N,一般是6,8,10,16的长度。
然后就可以生成一段对应的密码。
生成密码的要求,就是用户需要密码包括的字符,一般有需要大写、需要小写、需要数字、需要特殊,我们把用于选择需要生成类型数记为n。也就是用户如果要求有英文大小写和数值,那么n=3。n用于生成密码中间变量,可以得到所有用户要求。
对于不同的域名可以生成不同的密码,除了域名,还可以使用其它的字符。那么算法的要求是对于不同的输入,很少会生成相同的密码。对于相同的输入,生成相同密码。
于是用户需要记住的就是他的账号密码,遇到了在网站输入,就输入网站,于是得到网站密码,这样可以让用户只记住一个账号就可以。
算法也比较简单,实现有点复杂。
算法:
可以分为3步,第一步是生成组合字符,第二步进行混淆,第三步生成密码。
第一步的作用是生成作为密码的字符,第二步是防止第一步密码过于简单,防止可以从生成密码计算出用户账号密码,第三步是核心,用于生成密码。
- 生成组合字符
第一步需要先计算中间的值,计算方法:
x=md5(账号+域名)
x1=md5(密码+域名)
x2=md5(账号+密码+域名)
根据生成的中间值,可以计算出字符串s作为密码的生成字符,s的生成算法如下:
生成一段字符串s=x[0,1],x1[0,1],x2[0,1],x[2,3]…,也就是轮流三段字符串,按两个字符顺序组合出新的一段字符串,注意,这里使用md5得到的是一段把md5数值转16进制的字符。
最后还是需要把字符转数值,这里只是为了方便说明,实际可以直接就是数值放进去,但是注意分割时,需要拿一个8位数。也就是最大是255,用户要求所有字符加起来的值小于255,所以可以选8位,如果觉得这个选择太大,可以使用自己计算的方法。
假如生成md5的是49541A094FE0300DB87109AFEB306207
其中的每一个字符表示16进制数值。
于是两个两个拿出来按照顺序放到s中。两个两个拿出来可以作为混淆,虽然现在md5可以被破解,但是生成密码是无法得到用户的账号和密码和输入域名,所以不需要担心。
- 进行混淆
上面得到的s可能不够复杂,于是需要对上面生成的s进行混淆,混淆可以使用我的加密算法进行混淆。
使用之前的我写的哈希算法,可以把s混淆。
使用方法是申请一段缓存区,使用任意的哈希算法,进行哈希乱序,哈希乱序使用的密码是用户输入的密码。
之前的哈希算法存在哈希乱序、填补空白、字符加密,这里只需要进行哈希乱序。输入是s,和用户输入的密码,输出是乱序的 t 。
但是不需要进行填补空白和加密字符。
乱序之后,需要拿出来,拿出来的做法是去掉所有空白部分。使用如下算法,可以获得乱序的s:
首先清空s,然后
循环缓存区,判断当前字符是否是空白,如果不是空白,那么添加进s
这样,得到乱序的s字符串。
虽然得到s可能和没有混淆是一样的,但是这一步即使不加上也是没有问题。
得到的s字符串还不可以作为密码,需要进行最后一步。
- 生成密码字符
生成密码字符的难点,如何对应 s 的字符和生成密码的字符。
s 的字符是16进制数值,那么就是表示很少的区,但是可以通过使用两个字符可以表示255个字符,基本用户的要求可以得到。
把s按照两个字符分割,得到48个子字符串s1[],每个s1都是有两个字符。这里的s1是一个数组,包括48个字符串。
两个字符可以算出所有用户要求的字符,可以看到这个方法的不好的地方在于有些字符被用到概率比较高。
所以还需要一个变量记录 a