认证与会话管理
认证和授权,实际上是两件事情,但是很多人会混淆这两个概念。
- 认证的目的是为了认出用户是谁。
- 授权的目的是为了决定用户能够做什么。
形象比喻
-
用钥匙开门进屋,钥匙就是凭据。
-
进屋能做什么,不能做什么,就是授权。房间主人可以卖房等,租客只能住。
问题:持有钥匙的人一定是主人吗?
- 钥匙丢了,并被其他人捡到
- 钥匙被复制了
总结:
- 认证实际上就是一个验证凭据的过程。
- 如果只有一个凭证被用于认证,称之为单因素认证。
- 如果有两个或多个凭证被用于认证,称之为双因素或多因素认证。
- 多因素认证强于单因素认证,但会使用户感觉麻烦。
密码策略
- 长度(最好在16位以上)
- 组合(大写字母、小写字母、数字、其他特殊符号混合,+-*/~#$%&()=?<>';等)
- 不连续(123456,QWERRT...)
- 不重复(111111,AABBCC)
- 不用特殊数据(生日、姓名、学号,手机号等)
- 独立(不同网站使用不同密码)
对于网站后台,需要将用户密码经过特殊加密再进行保存,即使数据泄露,也增加了对方攻击成本。
彩虹表:明文和hash值对应的表
对抗彩虹表,加盐(密码中参杂自定义的(随机)字符)
多因素认证
- 动态验证码
- 数字证书
- 问题答案(密保问题)
- 安全盾
- 人脸识别
- ......
Session与认证
密码与证书等认证手段,一般仅用于登录的过程,当用户登录完成后,用户访问网站的页面,不能每次都要输入账号密码,因此,需要替换一个对用户透明的凭证,这个凭证,就是SessionID。
当用户登录完成,在服务器端就会创建一个新的会话(Session),会话中会保存用户的状态和相关信息,服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户即可,为了告诉服务器是哪个用户,浏览器需要将当前用户持有的SessionID告知服务器。
最常见的做噶就是把SessionID加密后保存在Cookie中,因为Cookie会随着HTTP请求头发送,且收到浏览器同源策略的保护。
但如果SessionID一旦在生命周期内被窃取,就等同于账户失窃(XSS、Sniff、木马窃取)。
在手机操作系统中,如果手机浏览器不支持Cookie,只能将SessionID作为URL的一个参数用于认证。
Session Fixation攻击(重放攻击)
A卖车给B,A藏了一把钥匙没有给B,B如果没有换锁,A还是能开走车。
这个没有换锁而导致的安全问题,就是Session Fixation问题。
Session保持攻击
- Session失效时间长
- 用户登陆后刷新页面,Session的过期时间就重新计时
- Session保存在Cookie中,通过修改Cookie中的过期(expire)时间来保持状态。
单点登录(SSO)
Single Sing On,用户只需要登录一次,就能访问所有的系统。
优点:方便
缺点:一旦被攻破,所有使用单点登录的系统都将沦陷。
解决:敏感系统再单独使用额外的验证机制。