某些 Web 页面只想让特定的人浏览,为达到这个目标,必不可少的就是认证功能。
HTTP使用的认证方式
-
BASIC 认证(基本认知)
-
DIGEST 认证(摘要认证)
-
SSL 客户端认证
-
FormBase 认证(基于表单认证)
BASIC认证没有加密处理,被盗的可能性极高,另外一般的浏览器无法实现认证注销操作。所以它不常用。
DIGEST认证提供防止密码被窃听的保护机制,但不存在防止用户伪装的保护机制。也不常用。
SSL客户端认证凭借客户端证书来认证。采用双因素认证,是指在认证过程中还需要密码这一因素。客户端证书需要支付一定费用才能使用。
基于表单认证 经常使用。在每个Web网站上会有各不相同的实现方式。

步骤1:客户端将ID和密码等登录信息放入报文的实体部分,以POST方法发送给服务器。这时,会使用HTTPS通信来进行HTML表单显示和用户输入数据的发送。
步骤2:服务器发放用以识别用户的SessionID。通过验证从客户端发过来的登录信息进行身份认证,然后把用户的认证状态与Session ID 绑定后记录在服务器端。
向客户端返回响应时,会在首部字段 Set-Cookie 内写入 Session ID。
为了防止 Session ID 被盗,Session ID 应使用难以推测的字符串,且服务器需要进行有效期的管理,保证其安全性。另外,为减轻跨站脚本攻击,建议事先在Cookie内加上httponly属性。
步骤3:客户端将接收到的Session ID 作为Cookie 保存在本地。下次向服务器发送请求,自动发送Cookie。服务器端可通过验证接收到的Session ID 识别用户和其认证状态。
服务端如何保存用户提交的密码等登录信息:通常,一种安全的保存方法是,先利用给密码加盐(salt)来增加额外信息,再使用散列(hash)函数计算出散列值后保存。
(salt:生成一个保证长度足够长,且是随机生成的字符串,然后把字符串和密码相连接(前后都可)生成散列值。当两个用户使用同一个密码时,由于随机生成的salt不同,对应的散列值也将是不同的。这样一来,很大程度减少了密码特征,攻击者也就很难利用自己手中的密码特征库进行破解)。
网友评论