目录
1. 认证与授权
2. 密码
3. 多因素认证
4. Session与认证
5. Session Fixation攻击
6. Session 保持攻击
7. 单点登录SSO
1. 认证与授权
认证的目的是为了认出用户是谁,而授权的目的是为了决定用户能够做什么。
认证实际上是一个验证凭证的过程。
如果只有一个凭证被用于认证,则称为“单因素认证”
如果有两个或多个凭证被用于认证,则称为“多因素认证”
2. 密码
密码的优点是成本低,使用起来方便,但缺点是其安全性较弱,可能会被猜解
目前黑客常用的暴力破解的手段,不是破解密码,而是利用弱口令猜解用户名,直到发现一个使用弱口令的账户为止。
密码的保存必须使用不可逆的加密算法,或者是单向散列函数算法,加密后存储在数据库中。
在用户注册时就将密码进行哈希(MD5或SHA-1)后保存至数据库,用户登陆时将用户提交的密码进行相同算法的哈希,再将该哈希值与数据库中的密码哈希值进行比较。
目前黑客破解MD5的一种方法是“彩虹表”,表内收集尽可能多的密码明文与明文对应的MD5值,这样只需要查询到MD5值就可以知道对应的明文。
为此引入了加盐哈希,盐值Salt增强了密码的复杂度。
3. 多因素认证
如果只有密码,安全性太低,所以大多数平台都会使用双因素认证或多因素认证。
例如手机动态口令、数字证书、支付盾、第三方证书……使得认证的过程更加安全。
4. Session与认证
当用户登录后,在服务端创建一个新的会话(Session),会话中保存用户的状态和相关信息。服务器维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前页面即可。
为了告诉服务器应该使用哪一个Session,浏览器需要把当前用户持有的SessionID告知服务器。
最常见的做法就是将SessionID加密后保存在Cookie中,因为Cookie会随着HTTP请求头发送,且受到浏览器同源策略的保护。
Session劫持就是通过窃取用户的SessionID,使用该SessionID登录目标账户进行攻击的方法,如果SessionID保存在Cookie中,则称为Cookie劫持。
SessionID还可以保存在URL中作为请求的一个参数,但是安全性很低。(很多手机浏览器不支持Cookie,就只能将SessionID作为URL参数)
5. Session Fixation攻击
在用户登录网站的过程中,如果SessionID没有发生变化,则会存在Session Fixation问题。
用户X获取到一个未经认证的SessionID,将其交给用户Y去认证,Y完成认证后,服务器没有更新此SessionID的值(注意是未改变SessionID而不是未改变Session),所以X可以直接凭借SessionID登录Y的账户。
如果SessionID保存在URL中,只要攻击者诱使用户打开这个URL,在该用户登陆完成后,黑客就可以直接通过此URL进入用户账户。
想要防止Session Fixation攻击,在登陆完成后,重写SessionID。
6. Session 保持攻击
保持该Session一直不失效,就可能一直成为攻击者的后门。
攻击者可以通过不停地发起访问请求(不停刷新页面、发送带有自定义Cookie头的HTTP包),让Session一直活下去。
在Web开发中,网站访问量如果比较大,维护Session可能会给网站带来巨大负担。因此,有一种做法,就是服务器端不维护Session,把Session放在Cookie中加密保存。当浏览器访问网站时,会自动带上Cookie,服务器端只需要解密Cookie即可得到当前用户的Session。
Cookie的Expire标签可以控制Session的失效时间,且这个时间完全由客户端控制。篡改这个世界使其永久有效,就可以得到一个永久有效的Session,服务器端无法察觉。
攻击者甚至可以为Session Cookie增加一个Expire时间,使得原本会浏览器关闭就失效的Cookie持久化地保存在本地,变成一个第三方Cookie。
7. 单点登录SSO
单点登录希望用户只需要登陆一次,就可以访问所有的系统。
SSO的优点在于风险集中化,只需要保护好这一个点。
SSO的缺点在于风险集中,这个点一旦被攻破全盘崩溃。
目前网上最为流行和开放的单点登录系统是OpenID。它使用URL作为用户的身份标识,每个用户拥有唯一的URL。
在使用OpenID时,第一步是向网站提供OpenID。
第二部,网站重定向到OpenID的提供者进行身份认证。
第三步,用户将在OpenID的提供者网站登录,并重定向回网站。