认证和授权

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

认证实际上就是验证凭证的过程。凭证可以是钥匙、指纹、虹膜等。

如果只有一个凭证被用于认证,则称为单因素认证

如果有两个或多个凭证被用于认证,则称为双因素(Two Factors)认证多因素认证

多因素认证的安全强度要高于单因素认证,但是在用户体验上,多因素认证会带来一些不方便的地方。

密码作为一种凭证,在存储时也需要注意一些问题。一般来说,密码必须以不可逆的加密算法,或者是单项散列函数算法,加密后存储到数据库中。这样做是为了尽最大可能地保证密码的私密性,即使是网站的管理人员,也不能够看到用户的密码。在这种情况下,黑客即使入侵了网站,导出数据库中的数据,也无法获取到密码的明文。

目前黑客们广泛使用的一种MD5加密的密码的方法是彩虹表

彩虹表的思路是收集尽可能多的密码明文和明文对应的MD5值。这样只需要查询MD5值,就能够找到该MD5值对应的明文。一个好的彩虹表,可能会非常庞大,但这种方法确实有效。

为了避免密码哈希值泄露后,黑客能直接通过彩虹表查询出密码的明文,在计算密码明文的哈希值时,增加一个saltsalt是一个字符串,它的作用时为了增加明文的复杂度,并能使彩虹表一类的攻击失效。

salt的使用:MD5(username+passwd+salt)

salt应该保存在服务器端的配置文件中,并妥善保管。

Session与认证

密码与证书等认证手段,一般仅仅用于登录(Login)的过程。当登录完成后,用户访问网站页面,不能每次浏览器请求页面时都在使用密码认证一次。因此,当认证成功以后,需要替换一个对用户透明的凭证。这个凭证就是sessionID。

当用户登录完成后,在服务器端就会创建一个新的会话(Session),会话中会保存用户状态和相关信息。服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前页面即可。为了告诉服务器应该使用哪一个Session,浏览器需要把当前用户的Session ID告知服务器。

最常见的做法就是把sessionID加密后保存在Cookie中,因为Cookie会随着HTTP请求发送,且收到浏览器通源策略的保护。

Session一旦在生命周期内被劫持,就等同于账户失窃。同时由于SessionID是用户登录后才持有的认证凭证,因此黑客不需要再攻击登录过程(比如密码),在设计安全方案时需要意识到这单。

Session劫持就是一种通过窃取用户SessionID后,使用该SessionID登录进目标账户的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。如果SessionID是保存在Cookie中的,则这种攻击可以称为Cookie劫持。

Cookie泄漏的方式有多种,最常见的有XSS攻击、网络Sniff,以及本地木马窃取,对于同构XSS漏洞窃取Cookie的攻击,通过给Cookie标记httponly,可以有效缓解XSS窃取Cookie的问题。但是其他泄露途径,比如网络嗅探或者Cookie文件失窃,则会涉及到客户端的环境安全,需要从用户客户端着手解决。

SessionID除了可以保存在Cookie中外,还可以保存在URL中,作为请求的一个参数,但是这种方式的安全性是难以经受考验的。

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