认证

认证的目的是为了认出用户是谁,授权的目的是为了决定用户能够做什么。

认证实际上就是一个验证凭证的过程。

密码

密码必须以不可逆的加密算法,或者是单向散列函数算法,加密后存储在数据库中。

多因素认证

如果只有一个凭证被用于认证,则称为“单因素认证”;如果有两个或多个凭证被用于认证,则称为“双因素(Two Factors)认证”或“多因素认证”。一般来说,多要素认证的强度要高于单因素认证,但是在用户体验上,多因素认证或多或少都会带来一些不方便的地方。

Session与认证

当认证成功之后,就需要替换一个对用户透明的凭证。这个凭证,就是SessionID。

最常见的做法就是把SessionID加密后保存在Cookie中,因为Cookie会随着HTTP请求头发送,且受到浏览器同源策略的保护。Session劫持就是一种通过窃取用户SessionID后,使用该SessionID登录进目标账户的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。如果SessionID是保存在Cookie中的,则这种攻击可以称为Cookie劫持。

在生成SessionID时,需要保证足够的随机性,比如采用足够强的伪随机数生成算法。现在的网站开发中,都有很多成熟的开发框架可以使用。这些成熟的开发框架一般都会提供Cookie管理、Session管理的函数。

Session Fixation攻击

用户登录网站前后SessionID没有发生改变,会导致Session Fixation问题。

具体攻击过程是,用户X(攻击者)先获取到一个未经认证的SessionID,然后将这个SessionID交给用户Y去认证,Y完成认证后,服务器并未更新此SessionID的值,所以X可以直接凭借此SessionID登录进Y的账户。

X如何才能让Y使用这个SessionID呢?如果SessionID保存在Cookie中,比较难做到这一点。但若是SessionID保存在URL中,则X只需要诱使Y打开这个URL即可。

解决Session Fixation的正确做法是,在登录完成后,重写SessionID。

Session保持攻击

一般的应用都会给session设置一个失效时间,当到达失效时间后,Session将被销毁。但有一些系统,出于用户体验的考虑,只要这个用户还“活着”,就不会让这个用户的Session失效。从而攻击者可以通过不停地发起访问请求,让Session一直“活”下去。

对抗方式:在一定时间后,强制销毁Session。这个时间可以是从用户登录的时间算起。但强制销毁Session可能会影响到一些正常的用户,还可以选择的方法是当用户客户端发生变化时,要求用户重新登录。最后,还需要考虑的是同一用户可以同时拥有几个有效Session。若每个用户只允许拥有一个Session,则攻击者想要一直保持一个Session也是不太可能的。当用户再次登录时,攻击者所保持的Session将被“踢出”。

单点登录(SSO)

单点登录的英文全称是Single Sign On,他希望用户只需要登录一次,就可以访问所有的系统。

SSO的优点在于风险集中化,就只需要保护好这一个点。

缺点也很明显,因为风险集中了,所以单点一旦被攻破的话,后果会非常严重,影响的范围将涉及所有使用单点登录的系统。

OpenID

OpenID是一个开放的单点登录框架,它希望使用URI作为用户在互联网上的身份标识,每个用户(End User)将拥有一个唯一的URI。当用户登录网站(Relying Party)时,用户只需要提交他的OpenID(就是用户唯一的URI)以及OpenID的提供者(OpenID Provider),网站就会将用户重定向到OpenID的提供者进行认证,认证完成后再重定向回网站。