某日帮客户处理后台问题,途中需要阅读代码,随眼一扫,感觉问题太多,以管理员登录后台为例

$data['admin_pass'] = md5(strtolower($_POST['admin_pass']));

短短的一行代码可以看到其中包含两个缺陷:

将用户输入转为小写,导致密码不区分大小写.

以允许使用英文和数字的 8 位密码为例,区分大小写有 218340105584896 种可能,不区分大小写只有 2821109907456 种可能,两者差距约为 77 倍,增加了密码被破解的可能性.

没有正确使用加密算法.

虽然 MD5 是一种不可逆的算法,但是网络安全人员通过彩虹表可以逆向查询到原始密码.破解的大致流程是这样的,首先计算出所有密码的可能性(原文),然后进行加密运算得到密文.当需要破解某个密码的时候,直接查询密文比对出原文即可得知明文密码.

为了对抗彩虹表攻击,开发人员曾使用增加 salt 的方式来增加攻击者成本.

md5('password' . 'salt')

知名论坛程序 Discuz! 就使用了类似的方式.一时间开发人员纷纷加盐,活脱脱咸菜世家的节奏.

现在的解决方案.

都 8102 年了,对技术稍微有点追求的开发者都在使用 bcrypt 了!