@
geelaw 对于你说的"攻击者可以直接发送加盐之后的结果"认真看内容啊,你没理解就自己设计破解方法了,太长我就简化下,你确定坏人能拿到我的数据重新提交?你随便提交,验证成功算我输!
服务器开启 https
post 下面几个数据给服务器
用户名
当前时间
随机值
sha256(用户名+sha256(密码)+当前时间+随机值)
服务器
判断客户端发来的时间是 60 秒以内
判断随机值不是在 60 秒或者更长时间内使用过
以上两个条件通过后,进行和客户端一样的计算,如果服务器存储时加盐了,客户端发送前要获取盐值
对比两个值是否一致,一致便通过,在 session 变量记录客户端 IP。每次客户端执行动作的时候判断 IP 是否一致。session 要有过期机制。
如果客户端提交的数据被再次提交,你试试能不能通过服务器的检查!不能吧?
只有两种可能破解
1.session 失效前另一个局域网的电脑偷取 cookie。和 UA 之类的浏览器标志,代替用户操作。
2.手段达到能随意修改用户页面,这个就不用讨论了。
同样还有更好的办法,比如
二次验证。
前端只提交用户名,提交后服务器将验证码发邮件或短信或微信通知用户,用户输入验证码完成登陆
客户端插件、软件防护
客户端插件简单的可以由浏览器插件实现,也可以用应用程序实现,用插件去预先获得一个客户端 ID 和密码(用来标识客户端),使用插件完成计算过程。使用客户端密码去计算用户信息比如 sha256 或者自己的加密算法并完成登录。软件防护就是监控这个网址的代码是不是被修改了。
这应该是市面上可以实现的绝大部分方法了。
但是这仍然不是绝对安全的,应用程序和操作系统都是可以逆向的。
至于"不要在你公司控制的网络下使用个人账户",这个只是说说而已,我们在给用户培训时说了一千遍一万遍,你觉得他们会听吗?密码 123456 的还少吗?所以我认为我们只能尽可能一步步去完善安全措施,降低用户出现损失的可能。
但是基于条件限制,我们不可能做到所有,所以我上面的回答也仅仅是因为很多人觉得没有意义,连程序员都觉得没有意义,用户又会在意什么呢? 123456,abc123,Abc123,当然是怎么简单怎么来。。