[其他] 认证与会话管理

最常见的认证方式就是用户名和密码(登录凭证)。
认证的目的是为了认出用户是谁,而授权的目的是为了决定用户能够做什么。
认证实际上就是一个验证凭证的过程。
如果只有一个凭证被用于认证,则称为“单因素认证”;如果有两个或多个凭证被用于认证,则称为“双因素认证”或“多因素认证”。


一、密码
密码是最常见的一种认证手段。
目前黑客们常用的一种暴力破解手段,不是破解密码,而是选择一些弱口令,然后猜解用户名,知道发现一个使用弱口令的帐户为止。由于用户名往往是公开的信息,攻击者可以收集一份用户名的字典,使得这种攻击的成本非常低,而效果却比暴力破解密码要好得多。
密码必须以不可逆的加密算法,或者是单向散列函数算法,加密后存储在数据库中。不能明文存储。将明文密码经过哈希后(比如MD5或者SHA-1)在保存到数据库中,是目前业界比较普遍的做法。在用户注册时就已将密码哈希后保存在数据库中,登录时验证密码的过程仅仅是验证用户提交的“密码”哈希值,与保存在数据库中的“密码”哈希值是否一致。
目前黑客们广泛使用的一种破解MD5密码的方法是“彩虹表”。可以使用salt的方法对抗彩虹表。


二、Session与认证
当用户登录完成后,在服务器端就会创建一个新的会话(Session),会话中会保存用户的状态和相关信息。
SessionID经常加密后保存在Cookie中,随着HTTP请求头发送。
SessionID一旦在生命周期内被窃取,就等同于帐户失窃。同时由于SessionID是用户登录之后才持有的认证凭证,因此黑客不需要再攻击登录过程。
Cookie泄露的途径有很多,最常见的有XSS攻击,网络Sniff,以及本地木马窃取。


三、Session Fixation攻击
如果登录前后用户的SessionID没有发生变化,则会存在此安全问题。
具体的攻击过程是,用户X(攻击者)先获取到一个未经认证的SessionID,然后将这个SessionID交给用户Y去认证,Y完成认证后,服务器并未更新此SessionID的值(注意是未改变SessionID,而不是未改变Session),所以X可以直接凭借此SessionID登录进Y的帐户。
如果SessionID保存在Cookie中,则此漏洞很难利用,但若是SessionID保存在URL中,则X只需要诱使Y打开这个URL即可。
在discuz7.2的WAP版本中,就存在这样的一个Session Fixation攻击。认证前的URL为:http://bbs.xxxx.com/wap/index.php?action=forum&fid=72&sid=2iu2pf
sid是用于认证的SessionID。用户登录后,这个sid没有发生改变,因此黑客可以先构造好此URL,并诱使其他用户打开,当用户登录完成后,黑客也可以直接通过此URL进入用户帐户。
解决Session Fixation的正确做法是:在登录完成后,重写SessionID。
当前此类攻击的用武之地越来越少。


四、Session保持攻击
攻击者通过不停地发起访问请求,让Session一直“活”下去。
有些网站为了减轻服务器端的压力,把Session放在Cookie中加密保存。当浏览器访问网站时,会自动带上Cookie,服务器端只需要解密Cookie即可得到当前用户的Session了。
很多应用都是利用Cookie的Expire标签来控制Session的失效时间。
Cookie的Expire时间是完全由客户端控制的。篡改这个时间,并使之永久有效,就有可能获得一个永久有效的Session,而服务器端是完全无法察觉的。
对抗session保持攻击的方法是,在一定时间后,强制销毁Session


五、单点登录(SSO)
用户只需要登录一次,就可以访问所有的系统。从安全的角度看,SSO把风险集中在单点上,有利有弊。
SSO的优点在于风险集中化,只需要保护好一个点即可。
SSO的缺点在于单点一旦被攻破的话,后果会非常严重,影响的范围将涉及所有使用单点登录的系统。
目前互联网上最为开放和流行的单点登录系统是OpenID。OpenID是一个开放的单点登录框架。
在使用OpenID时,第一步,是向网站提供OpenID。第二步,网站重定向到OpenID的提供者进行身份认证。第三步,用户将在OpenID的提供者网站登录,并重定向回网站。

你可能感兴趣的:([其他] 认证与会话管理)