一、概念
1、认证的目的是为了认出用户是谁,授权的目的是为了决定用户能够做什么。
2、认证实际上就是一个验证凭证的过程。
3、如果只有一个凭证被用于认证,则称为“单因素认证”;如果有两个或者多个凭证被用于认证,则称为“双因素认证”或者“多因素认证”。一般来说,多因素认证的强度要高于单因素认证。
二、说说密码
1、密码是最常见的一种认证手段,持有正确密码的人被认为是可信的。“密码强度” 是设计密码认证方案时第一个需要考虑的问题。
2、黑客们常用的一种暴力破解手段,不是破解密码,而是选择一些弱口令,比如123456,然后去猜解用户名,知道发现一个使用弱口令的账户为止。由于用户名往往是公开的信息,攻击者可以收集一份用户名的字典,是的这种攻击的成本非常低,而效果却比暴力破解密码要好很多。
3、密码的保存也有一些需要注意的地方。一般来说,密码必须以不可逆的加密算法,或者是单向散列函数,机密后存储在数据库中。将明文密码经过哈希后(比如MD5或者SHA-1)再保存到数据库中,是目前业界比较普遍的做法——在用户注册时就已经将密码哈希后保存在数据库中,登录时验证密码的过程仅仅是验证用户提交的“密码”哈希值,与保存在数据库中的“密码”哈希值是否一致。目前黑客们广泛使用的一种破解MD5后密码的方法是“彩虹表”。彩虹表的思路是收集尽可能多的密码明文和明文对应的md5值。这样只需要查询md5值,就能找到该md5值对应的明文。为了避免密码哈希值泄漏后,黑客能够直接通过彩虹表查询出密码明文,在计算密码明文的哈希值时,增加一个“salt”。“salt”是一个字符串,它的作用是为了增加明文的复杂度,并能使得彩虹表一类的攻击失效。
salt的使用如下:
MD5(username+password+salt)
salt应该保存在服务器端的配置文件中,并妥善保存。
三、session与认证
当用户登录完成后,在服务器端就会创建一个新的会话(session),会话中会保存用户的状态和相关信息。服务器端维护所有在线用户的session,此时的认证,只需要知道是哪个用户在浏览当前的页面即可。为了告诉服务器应该使用哪一个session,浏览器需要把当前用户持有的sessionID告诉服务器。常见的做法就是把sessionID加密后保存在cookie中,因为cookie会随着HTTTP请求头发送,且受到浏览器同源策略的保护。
session劫持就是一种通过窃取用户sessionID后,使用该sessionID登录进目标账户的攻击方法,此时攻击者实际上是使用了目标账户的有效session。如果sessionID是保存在cookie中的,则这种攻击可以称为cookie劫持。
sessionID除了可以保存在cookie中外,还可以保存在URL中,作为请求的一个参数。但是这种方式的安全性难以经受考验。 在生成sessionID时,需要保证足够的随机性,比如采用足够强的伪随机数生成算法。现在的网站开发中,都有很多成熟的开发框架可以使用。
四、谈谈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。如果session一直不销毁的话,攻击者就能通过此有效的session一直使用用户的账号,成为一个永久的“后门”。攻击者可以通过不停地发起访问请求,让session一直活下去。(登录进用户的账号,不停地刷新页面)
如何对抗session保持攻击呢?
(1)在一定时间后,强制销毁session
(2)当用户客户端发生变化时(比如用户的IP、useagent等),要求用户重新登录。
(3)同一个用户可以同时拥有几个有效的session。
六、单点登录(sso)
它希望用户只需要登录一次,就可以访问所有的系统。从安全的角度来看,sso把风险集中在单点上,这样做有利有弊。
目前互联网上最为开放和流行的单点登录系统是OpenID。OpenID是一个开放的单点登录框架。在用户登录网站时,用户只需要提交他的OpenID(就是用户唯一的URI)以及OpenID的提供者,网站就会将用户重定向到OpenID的提供者进行认证,认证完成后再重定向回网站。
七、总结
认证的手段是丰富多彩的。在互联网中,除了密码可以用于认证外,还有很多新的认证方式可供使用。我们也可以组合使用各种认真手段,以双因素认证的方式,提高安全强度。
在WEB应用中,用户登录之后,服务器端通常会建立一个新的session以跟踪用户的状态。每个session对应一个标识符sessionID,sessionID用来标识用户身份,一般是加密保存在cookie中。有的网站也会将session保存在cookie中,以减轻服务器端维护session的压力。围绕着session可能会产生很多安全问题,这些问题都是设计安全方案时需要考虑到的。