1、认证VS授权 authentication authorization
认证:认出用户是谁;实际上就是一个验证凭证的过程。
授权:决定用户能干什么。
单因素认证:只验证一个凭证
双因素认证:只验证两个凭证
多因素认证:....
2、密码:最常见的认证手段
长度考虑:
普通应用6位以上
重要应用8位以上,并考虑双因素认证
密码复杂度:
区分大小写
小写字母、大写字母、数字、符号两种以上的组合
不能有连续性字符,如abcd1234
避免重复字符,如aaaa
其他:
避免简单单词,如good;
不要使用用户的公开数据或与个人隐私相关的数据,如姓名简写、QQ号码、身份证号码、昵称、电话号码、生日、英文、公司名等
黑客破解
老套:暴力破解
新招:简单密码+猜解用户名
密码保存:必须以不可逆加密算法或者单向散列的函数算法,加密后存储在数据库中
彩虹表:收集尽可能多的密码明文和对应的MD5值,只需要查询到MD5值,就能找到对应明文密码;
应对方案:计算密码明文哈希值时,加入一个salt字符串,增加明文复杂度,salt应善加保存在服务端
3、多因素认证
支付宝:支付密码、手机动态口令、数字证书、宝令、支付盾、第三方证书等
4、session与认证
密码与认证等手段一般仅用于登录,此后需要采用一个对用户透明的凭证,即sessionID。
最常见的做法是把sessionID加密保存在Cookie,随HTTP请求头发送到服务端;
Cookie泄露的途径:XSS攻击、网络Sniff、本地木马窃取;
对于通过XSS漏洞窃取Cookie的攻击,通过给Cookie标记httponly,可以有效缓解。
SessionID还可以保存在URL中,作为请求的一个参数,不安全。
生成sessionID时,需要保证足够的随机性。
5、Session Fixation攻击
两个用户先后登录网站,而用户的SessionID没有发生变化,则会存在Session Fixation问题。
解决办法:登录完成后,重写SessionID。
6、Session保持攻击
SessionID是有生命周期的,当用户长时间未活动或点击退出后,服务器将销毁sessionid;
Cookie也有失效时间;
某些应用可以通过不停的发起访问请求,让session一直活下去。
Cookie的expire时间是完全可以有客户端控制的,篡改这个时间,并使之永久有效,就有可能获得一个永久有效的Session。
解决办法:
一定时间后,强制销毁Session
当用户IP、useragent等信息发生变化时,强制销毁session,要求用户重新登录;
限制同一用户可以拥有的有效session数。
7、单点登录(SSO:Single Sign On)
用户只需要登录一次,就可以访问所有的系统。
SSO的优点:风险集中化,只需要保护这个一共点;
SSO的缺点:风险集中化,一旦这个点被攻破,后果将非常严重。
OpenID目前互联网上最为开放和流行的单点登录系统。
每个用户将拥有一个唯一的URI,用户登录网站时,只需要提交其OpenID(用户的URI)以及OpenID的提供者,网站就会将用户重定向到OpenID的提供者进行认证,认证完成后再重定向回网站。