原文连接:http://lib.csdn.net/article/nodejs/12131
Node.js实践HTTP安全认证之一~~基本认证
作者:zwjabcd
众所周知,近来有许多关于http网站更换为https的消息,http作为网站常用的网络协议到底有什么缺陷,http自己有什么样的安全认证体系,难道不能保证信息的完整性和安全性吗?带着这个疑问我最近详细阅读了《http权威指南》这本书,并且实际使用node.js作为服务端,一一实践书上提到的安全认证方法,同时记录下来以飨读者。
本文从基础出发,先从最简单的开始。最简单的HTTP认证形式应该是基本认证(basic authentication)。基本认证的安全的功能有限,只能用于最简单的安全认证环境,也就是说,只能实现基本的对于资源的访问限制,是在假定没有恶意用户或者攻击者拦截网络流量进行分析的环境中使用。
HTTP本身就支持原始的质询/响应(challenge/response)框架,简化了对于用户的认证过程。
下面引用书中的一幅图(12-1):
从书中可以看出,服务器提示客户端需要认真,在客户端的用户需要先输入用户名和密码才能继续访问资源。服务器和客户端的这一系列交互的过程是通过HTTP头部的信息完成传递的。
第一步,用户发生GET请求,请求资源;
第二步,服务器返回401的状态码,并且返回WWWW-Authenticate首部,在该首部指定认证算法和提示信息等内容;
第三步,用户再次发送GET请求用户输入用户名密码,并且包含Authorization首部,说明认证算法,用户名和密码;
第四步,如果正确,服务器端返回200状态码,并包含Authentication-Info首部(可选);
接下来使用Node.js完成服务器端(不包含对于正确返回的信息的验证):
var http=require('http');
http.createServer(function(req,res){
console.log(req.headers);
res.writeHead(401,{
'content-Type':'text/plain',
'WWW-Authenticate':'Basic realm="family"'
});
res.end('');
}).listen(9000,'127.0.0.1');
console.log('server running at localhost:9000 ');
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
将服务器端启动起来之后,在浏览器发送http://localhost:9000/请求,出现如下截图:
通过查看返回的http包头可以发现服务器返回了401状态码及前文提到的WWW-Authenticate首部:
输入用户名和密码后再次发送GET请求,这时服务器端获取到了客户端发送的信息:
图中可以看出,authorization首部中包含了认证算法Basic,以及用户名和密码的编码结果“YWFhOmFhYQ==”。这个编码是简单的Base-64编码,通过工具很容易得到它的 原文是:aaa:aaa,这就是用户名和密码。服务器端据此可以实现对于用户的认证和资源的管理。
Base-64编码谈不上什么密文,可以很容易的解码,所以基本认证是一种非常简单的认证方式,在安全方面无法提供太大的帮助。
所以:
安全使用基本认证的唯一方式就是将其与SSL配合使用。
参考文献:
1. 《node即学即用》
2. 《HTTP权威指南》