第9章 认证与会话管理
9.1 Who am I?
- 认证与授权
认证 | 授权 |
---|---|
Authentication | Authorization |
为了认出用户是谁 | 为了决定用户能够做什么 |
认证就是开锁的过程。开门之后,什么事情能做,什么不能做,就是“授权”的管辖范围了。
如何授权是取决于认证的。
- 认证是一个验证凭据的过程。
- 单因素认证 & 双因素认证 & 多因素认证
- 一般来说,多因素认证的强度要高于单因素认证,但是在用户体验上,多因素认证或多或少会带来一些不方便的地方。
9.2 密码的那些事儿
- 密码是最常见的一种认证手段
- 密码的优点是使用成本低
- 密码的缺点是密码认证是一种比较弱的安全方案,可能会被猜解。
- 设计密码认证方案要考虑的因素:
- 密码强度(OWASP推荐)
- 密码长度
- 密码复杂度
- 另外,不要使用用户的公开数据,或者是与个人隐私相关的数据作为密码。
- 密码的保存
- 密码必须以不可逆的加密算法,或者是单向散列函数算法,加密后存储在数据库中。
- 将明文密码经过哈希后(比如MD5或者SHA-1)再保存到数据库中,是目前业界比较普遍的做法。
- 彩虹表是目前广泛使用的一种破解MD5后密码的方法。
- 防范:再计算密码明文的哈希值时,增加一个Salt
- Salt是一个字符串,它的作用是为了增加明文的复杂度,并能使得彩虹表一类的攻击失效。
- 密码强度(OWASP推荐)
9.3 多因素认证
多因素认证提高了攻击的门槛。
9.4 Session与认证
- 密码与证书等认证手段,一般仅仅用于登录的过程。
- 当认证成功后,需要替换一个对用户透明的凭证,这个凭证就是SessionID。
- 当用户登录完成后,在用户端就会创建一个新的会话(Session),会话中会保存用户的状态和相关信息。
- 服务器端维护所有在线用户的Session。
- 最常见的做法就是把SessionID加密后保存在Cookie中,因为Cookie会随着HTTP请求头发送,且受到浏览器同源策略的保护。
- SessionID一旦在生命周期中被窃取,就等同于账户失窃。
- Session劫持就是一种通过窃取用户SessionID后,使用该SessionID登录进目标账户的攻击方法。此时攻击者实际上是使用了目标账户的有效Session。
- 如果SessionID是保存在Cookie中的,则这种攻击可以称为Cookie劫持。
- SessionID除了可以保存在Cookie中外,还可以保存在URL中,作为请求的一个参数。
- 但是这种方式的安全性难以经受考验。
- 在生成SessionID时,需要保证足够的随机性,比如采用足够强的伪随机数生成算法。
9.5 Session Fixation攻击
- 卖车,不换锁的例子。
- 这个没有换“锁”而导致的安全问题,就是Session Fixation问题。
- 在用户登录网站的过程中,如果登录前后用户的SessionID没有发生变化,则会存在Session Fixation问题。
- 解决Session Fixation的正确做法:在登录完成后,重写SessionID。
9.6 Session保持攻击
- Session如果一直未能失效,会导致什么问题呢?
- 如果攻击者能一直持有一个有效的Session,而服务器对于活动的Session也一直不销毁的话,攻击者就能通过此有效Session,一直使用用户的账户,成为一个永久的“后门”
- 攻击者如何永久地持有一个Session?
- 攻击者可以通过不停地发起访问请求,让Session一直“活”下去。
- Cookie是可以完全由客户端控制的,通过发送带有自定义Cookie头地HTTP包。
- 有一种做法是服务器端不维护Session,而把Session放在Cookie中加密保存。
- Cookie的Expire时间是完全可以由客户端控制的。
- 篡改这个时间,并使之永久有效,就有可能获得一个永久有效的Session,而服务器端完全无法察觉。
- 攻击者甚至可以为Session Cookie增加一个Expire时间,使之持久化地保存在本地,变成一个第三方Cookie。
- Cookie的Expire时间是完全可以由客户端控制的。
- 如何对抗这种Session保持攻击?
- 在一定时间后,强制销毁Session
- 当用户客户端发生变化时,要求用户重新登录。
- 如IP、UserAgent等信息。
- 每个用户只允许拥有一个Session。
9.7 单点登录(Single Sign On,SSO)
- 单点登陆,希望用户只需要登录一次,就可以访问所有的系统。
- SSO的优点:在于风险集中化,就只需要保护好这一点。
- SSO的缺点:因为风险集中了,所以单点一旦被攻破的话,后果会非常严重,影响的范围将涉及所有使用单点登录的系统。
- 降低这种风险的办法:在一些敏感的系统里,再单独实现一些额外的认证机制。
- 目前最为开放和流行的单点登录系统时OpenID。
- OpenID模式仍然存在一些问题
- OpenID的提供者服务水平也有高有低。
9.8 小结
- 认证的手段
- 密码
- 双因素认证/多因素认证
- Session
- SessionID
- 单点登录
- OpenID