web登录设计
web登录设计
##登录## 1. 服务端设置,登录页面https, 接受到口令之后,服务端新生成一个随机的sessionId 放到cookies中(如果客户端之前已经有sessionId了,用新生成的替换老的-会话固定攻击),然后设置cookies http-only和secure标识。 2. 保存用户密码:使用Md5(password + salt)存储,如果需要更强的加密效果,替换Md5为bcrypt 3. 验证码:最好不用 4. 是否允许浏览器的保存密码(安全妥协过程)
记住我
- 不要让cookie有权限访问所有的操作。下面的这些功能一定要用户重新输入口令:修改口令,消费等
- 具体实现细节
- 在cookie中,用户名,登录序列,登录token。
- 用户名:明文存放。
- 登录序列:一个被MD5散列过的随机数,仅当强制用户输入口令时更新(如:用户修改了口令)。
- 登录token:一个被MD5散列过的随机数,仅一个登录session内有效,新的登录session会更新它。
- 登录token是单实例登录。意思就是一个用户只能有一个登录实例。
- 登录序列是用来做盗用行为检测的。如果用户的cookie被盗后,盗用者使用这个cookie访问网站时,我们的系统是以为是合法用户,然后更新“登录token”,而真正的用户回来访问时,系统发现只有“用户名”和“登录序列”相同,但是“登录token” 不对,这样的话,系统就知道,这个用户可能出现了被盗用的情况,于是,系统可以清除并更改登录序列 和 登录token,这样就可以令所有的cookie失效,并要求用户输入口令。并给警告用户系统安全。
找回密码
- 不要使用安全问答:用户记不住,容易被社工
- 保存好老的密码,发送一个唯一的url给注册邮箱,设置有效时间,用户点击之后可以设置新的密码(整个找回密码的功能必须是安全的:发送的url事https的,设置密码页面也是https的)
检查密码强度
- 简单的字符复杂度
- 键盘复杂度(asdfghjkl这种)
防范暴力测试登录密码
- 多次失败之后验证码,
- 锁定账户,需要邮件解锁
- 每次失败尝试之后,延迟, 1次失败,1s之后才能重新登录,2次失败,4s之后才能重新登录,3次失败,1分钟之后才能重新登录
分布式的攻击方式
- 在多个僵尸网络发起攻击,防止IP被屏蔽
- 使用最常用的1个密码,对所有用户进行登录尝试,而不是每一个用户进行常用的500个密码尝试
- 登录用户1,登录用户2, 登录用户3, 再循环登录用户1, 这样就避免了对用户1的登录延迟作用。
- 防范方式,纪录网站的登录失败次数,如果有大幅变化,报警处理(比如延缓所有用户的登录时间)
双重认证
- 比如密码加手机验证码
http://coolshell.cn/articles/5353.html http://stackoverflow.com/questions/549/the-definitive-guide-to-form-based-website-authentication http://www.cnblogs.com/lixiong/archive/2011/12/24/2300098.html