登录一般需要三个信息:用户名,密码,验证码
攻击思路:
1.抓包获取用户名和密码
2.破解数据库获取用户名密码
对于1
如果只是将密码用md5转一下,那么抓包者还是可以攻击。
将密码的MD5和验证码一起md5运算,抓包者不能重放攻击,但是数据库不安全了。
对于2
需要存储密码的信息摘要。这个必须是前端传输进来的值的运算结果
1和2如何兼得?
因为算法是暴露的,任何计算方式都是别人容易知道的。
一种分割密码的思路
比如密码长度最小8位 设为password ,验证码是code 从中间分成两部分,前一部分在数据库中存1次md5:md5(pass),
后部分存2次md5: md5(md5(word))
登录时,前部分针对抓包攻击,后部分针对数据库泄露攻击。
前一部分传输md5(md5(pass)+ code),后一部分传输md5(word).
服务器同时比较前一部分和后一部分,如果匹配则登录成功。
这样既防止重放攻击,又能防止数据库泄露攻击。
当然这里只是一种思路,在https的环境下避免了重放攻击,无需这么麻烦。