云存储中的HTTP鉴权算法分析

标签: 分布式存储 存储技术 算法数据结构 软件技术 AWS S3 | 发表时间:2014-02-07 22:31 | 作者:童燕群
出处:http://shentar.me

基于Base64编码的 HTTP Basic Authentication由于安全问题,已经不再广泛使用了。在云存储中,数据的安全性一直被广泛关注。亚马逊的AWS S3和Openstack Swift分别采取了不同的算法来对每一个HTTP请求进行鉴权。这里想对二者的鉴权过程作简单分析和总结。

一、AWS S3的HTTP请求鉴权流程

AWS采取的鉴权算法类似于HTTP基本认证。我们知道Base64只是对字符串进行了一个转换存储,是可以反向解析出源字符串的,因此基本认证中使用Base64编码处理过的用户名和密码可以被截获,一旦用户名和密码泄漏,黑客可以构造任何需要的请求进行数据窃取和改写。AWS采用的是签名认证的思想来解决这一问题,详细的过程参见: 链接

signing-overview

基本原理:

1、客户端将请求中的通用信息(如:Bucket Name、Object Name、请求时间和请求方法名等)和SecretAccessKey(下文简称SK)进行SHA256哈希计算得到一个字符串;
2、最终在HTTP请求中传输的是该HASH值。其中AccessKey(下文简称AK)在请求中明文传输;
3、服务端拿到该请求后,首先提取出AK,然后根据AK到服务端的数据库中查询出开户时分配给该用户的SK;
4、服务端从请求中提取通用信息,配合查询得到的SK,使用同样签名计算过程计算一个签名,然后与请求中携带的签名进行比对,二者一致则认为该请求是合法请求,鉴权通过。否则返回403鉴权失败。

如果整个HTTP请求被截获,黑客虽然能得到该鉴权值,但是无法反解析出用户的SK,因为SHA是不可逆的哈希算法。因此最坏的情况:可以重复发送该请求(不修改请求中任一参数)到服务端,攻击范围有限。假设,黑客想使用该鉴权值伪造新的请求,那么修改请求中的通用信息,而签名值没有改变,最终鉴权也无法通过。

那么是不是黑客可以一直使用该鉴权发送该请求呢?也不是的,AWS S3拿到请求后会比对服务端的时间与请求中的时间的差值,如果该请求的发出时间比服务端的时间早15分钟,则认为该请求为非法请求。

从上面的过程来看,AWS的鉴权算法非常好的解决了密钥泄漏和每一个请求都能得到鉴权的问题。

二、再来看基于Keystone的Openstack Swift的HTTP请求鉴权流程

Keystone的原理比较简单,整个系统提供全局唯一的Keystone服务,客户端在发送HTTP请求之前,首先需要向Keystone申请一个Token(定长的字符串),该Token的有效期由Keystone服务端来指定。申请Token时,需要向Keystone提供用户名和密码,这里可以理解成AWS中的AK和SK,Keystone认证通过该用户之后,发放Token给客户端。之后客户端每次发送HTTP请求时都必须携带该Token,Swift拿到该Token和用户名信息后,也会像Keystone查询该Token是否有效。Token有效,则继续处理该业务,Token无效,则返回鉴权失败。具体的流程可以从如下序列图看出:

Openstack Swift与Keystone实现请求鉴权流程

这样的鉴权过程存在一些问题:

1、相比于AWS的鉴权,这里如果Token泄漏,会造成比较严重的后果,虽然Token有有效期,但是每次都需用用户名和密码去申请,频繁申请也有可能会造成密钥的泄漏;
2、每一次请求都需要Swift与Keystone之间作一次交互,性能可能存在问题。

事实上,Openstack就发生过多次Token永久有效的bug,导致数据被破坏。当然这样的架构也有其优点,Keystone可以在多个服务间共享,将鉴权逻辑集中管理,做到了服务级的重用,而AWS必须在每一个服务中解析和生成签名,只能做到模块或者代码级别的重用。

相关 [云存储 http 鉴权] 推荐:

云存储中的HTTP鉴权算法分析

- - 忘我的追寻
基于Base64编码的 HTTP Basic Authentication由于安全问题,已经不再广泛使用了. 在云存储中,数据的安全性一直被广泛关注. 亚马逊的AWS S3和Openstack Swift分别采取了不同的算法来对每一个HTTP请求进行鉴权. 这里想对二者的鉴权过程作简单分析和总结.

HTTP Headers 入门

- johnny - Time Machine
非常感谢 @ytzong 同学在twitter上推荐这篇文章,原文在此. 本文系统的对HTTP Headers进行了简明易懂的阐述,我仅稍作笔记. 什么是HTTP Headers. HTTP是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的,比如这篇文章.

HTTP基础

- - ITeye博客
HTTP的结构主要包括下面几个要点:. HTTP的版本主要有1.0,1.1 和更高版本.    1.1 及以上版本允许在一个TCP连接上传送多个HTTP协议,1.0能 .    1.1 及以上版本多个请求和响应可以重叠,1.0不能.    1.1 增加了很多的请求头和响应头.     一个请求行,若干小心头,以及实体内容,其中的一些消息头和实体内容是可选的,消息头和实体内容需要空行隔开.

HTTP Header 详解

- - 博客园_Ruby's Louvre
HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议. HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应. 就整个网络资源传输而言,包括message-header和message-body两部分. 首先传递message- header,即 http header消息.

HTTP/2 in Netty

- -
Here, we created a context for the server with a JDK SSL provider, added a couple of ciphers, and configured the Application-Layer Protocol Negotiation for HTTP/2..

HTTP负载测试

- - 博客 - 伯乐在线
英文原文: ON HTTP LOAD TESTING 来源: oschina. 有很多人在谈论HTTP服务器软件的性能测试,也许是因为现在有太多的服务器选择. 这很好,但是我看到有人很多基本相同的问题,使得测试结果的推论值得怀疑. 在日常工作中花费了很多时间在高性能代理缓存和源站性能测试方面之后,这里有我认为比较重要的一些方面来分享.

HTTP断点续传

- - CSDN博客互联网推荐文章
要实现断点续传的功能,通常都需要客户端记录下当前的下载进度,并在需要续传的时候通知服务端本次需要下载的内容片段. HTTP1.1协议(RFC2616)中定义了断点续传相关的HTTP头 Range和Content-Range字段,一个最简单的断点续传实现大概如下:.   1.客户端下载一个1024K的文件,已经下载了其中512K.

http-kit 1.2 发布

- - 开源中国社区最新新闻
Http-kit 是主要由Java 和Clojure开发,为Clojure定制的零依赖的Http lib,包括异步的高性能HTTP Server 和 HTTP Client. 在普通的PC上进行性能测试时,http-kit server 每秒能处理数万个请求. 修复处理文件上传时,content-type没能正确处理.

HTTP缓存算法

- - PHP源码阅读,PHP设计模式,PHP学习笔记,项目管理-胖胖的空间
HTTP协议缓存的目标是去除许多情况下对于发送请求的需求和去除许多情况下发送完整请求的需求. 以不发送请求或减少请求传输的数据量来优化整个HTTP架构,此目标的实现可以产生如下好处:. 降低对原始服务器的请求量. 减少了传送距离,降低了因为距离而产生的时延. 缓存基本处理过程包括七个步骤. 接收 – 缓存从网络中读取抵达的请求报文.

HTTP头部详解

- - CSDN博客推荐文章
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP 协议的详细内容请参考RFC2616. HTTP协议采用了请求/响应模型. 客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构.