或许你会问。这么以来后面也就是只要前面14位一样就可以成功了?那么不是同样加大了密码被暴力破解出来的可能性吗?因为只要满足前14位相同就可以登陆成功啊!也就是说加入后面2位带来的组合有1000种。那么就是说我只要破解出这1000种组合里的1个就能成功登陆了。如果只是这样做,虽然是密码复杂性加大,但是也导致密码更容易被破解,那么如何解决这个问题?
笔者思考了很久,终于有了头绪,那就是——让用户自定义截取的长度,及截取的位置、对加密长度再进行自定义组合。那么在网站没被攻陷之前,你是没有办法的得知密码的解密及截取组合方式的。想要按照上面说的按照列出可能的所有组合然后再进行爆破得到一个就得到权限,就不可能了。因为按照我上面的办法组合出来的密码的可能组合数是不可测的,全部列举出来都够建立一个MD5加密查询的数据库了。所以攻击者只能放弃对md5密码的猜解。那么及时我给你密文。给你后台地址。你也永远进不去。永远得不到权限了。
光说不做没有意义,接下来就讲讲具体的实现办法:下面粗糙的写了几个简单例子,具体应用看各位程序员自己灵活运用思路了。先定义几个变量:
1. password1(客户端提交的密码)
2. password2(服务端数据库内的密码)
3. beginnumber (开始截取的位置)
4. number (截取位数)
首先是注册页面,用户提交的所有资料都进行md5加密,关键部分例如:密码则使用下面的混淆加密,或者索性全部使用下面的混淆加密方式好了
首先申明:截取的部分是要被丢弃的部分,丢弃的部分需要用其他字符串来填充(如果你喜欢直接用截取的,就不必要使用填充了),下面是填充部分的随机数函数
用来随机生成由0-9及a-z的组合,你也可以自己修改成带大写字母的
Function gen_key(digits)
'定义并初始化数组
dim char_array(80)
'初始化数字
For i = 0 To 9
char_array(i) = CStr(i)
Next
'初始化小写字母
For i = 36 To 61
char_array(i) = Chr(i + 61)
Next
Randomize '初始化随机数生成器。
do while len(output) < digits
num = char_array(Int((62 - 0 + 1) * Rnd + 0))
output = output + num
loop
'设置返回值
gen_key = output
End Function
'把结果返回给浏览器