参考链接:
1、http://phantom0301.cc/2016/02/19/Hpfeeds/
2、http://www.yanglajiao.com/article/xumesang/50569842
3、http://www.cnblogs.com/lijingchn/p/5566662.html
在对一些开源蜜罐进行研究时,不可避免地会涉及到hpfeeds协议,那么hpfeeds协议究竟是什么呢?里面的一些机制、使用又是怎样的一个情况呢?为什么开源蜜罐MHN、T-pot都使用这个协议呢?
一、HPFEEDS协议是什么
hpfeeds是一个轻量级的验证发布-订阅协议(authenticated publish-subscribe protocol)。
- 1、轻量级:简单来说就是代码量较少、功能相对不复杂。
- 2、验证:需要认证的公开协议。
- 3、发布-订阅协议:订阅发布协议定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。它是为了解决这样一种情况的发生,一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象需要改变。这就类似于发传单,目标发送通知,没有指定特定的对象,通知会自动传播,观察者自己决定是否需要看传单,发送者对于传单是否被看一无所知。
二、HPFEEDS协议简介
hpfeeds把不同的数据用频道来划分,支持传送任意的二进制数据。由频道的使用者决定传送数据结构的形式。进入频道需要一个“授权钥匙”(Authkey),它由两部分组成:ident和secret,相当于身份和密码。把密码和每次连接的一个随机数进行hash摘要算法然后一起发送给服务器(即发送到服务器的secret映射到一个连接),这样保证不会被窃听,所以它可以运行在SSL、TLS下。不同的钥匙会被赋予不同的频道权限。
三、HPFEEDS协议组成
1、线路协议组成:每个hpfeeds协议消息都携带了一个固定格式的消息头,有两个参数:消息总长度和请求类型。
消息类型
完整消息
2、消息的认证过程
- 1)服务器针对每一个连接发送一个随机数
- 2)客户端发送id和sha1(随机数+"授权钥匙")散列
- 3)服务器通过id查找"授权钥匙"并检查散列值
- 4)服务器检查数据类型,是要发布还是要订阅
四、HPFEEDS的原理
hpfeeds协议通过以下几部分实现:hpfeeds server, hpfeeds client,mongodb数据库。
- 1、hpfeeds server:
负责为每个client的连接生成一个连接标志;
检查请求连接的client的id和sha1(nonce+Authkey);
检查client的请求类型,发布还是接收。 - 2、hpfeeds client:
每个hpfeeds client都即可以作为发布者也可以作为订阅者,发布者和订阅者并不要求必须同时存在。 - 3、mongodb:
mongodb数据库用来存储每个client的id和secret,并且每当有client请求连接server时,server都会从mangodb中取出该client注册时的id和secret进行对比。 若对比一致则认证通过,client可以和server正常建立连接;若不一致则client与server建立连接失败。 -
4、client和server的认证过程:
认证
hpfeeds协议建立连接及通信的过程:
1、Client发起连接请求;
2、server为每个client的连接生成一个连接标志,并将其发送给请求连接的client;
3、client发送自己的id和sha1(nonce+Authkey)到server进行认证;
4、server从mongodb中取出相应的信息检查验证,若认证通过,保持连接并执行后续操作。否则,断开连接;
5、client发起publish/subscribe请求;
6、server检查client请求消息的类型,发布/订阅。
五、为什么使用HPFEEDS
整个协议实现了三方的功能独立。使用这种方式降低了应用与业务逻辑之间的耦合,统一一个对外的发布接口,只需要关心监听的类型,不关心监听的具体处理人。只管发,不管到不到。很方便的建立一种一对多的依赖关系。
优点:
1.降低耦合。发布者对于接收者的数量,身份,接收的数据类型一无所知。
2.安全性高。只有消息订阅者之间的单线信息交互,不存在其他程序的信息交换。
3.测试方便。
缺点:
性能降低,订阅要进行管理
六、HPFEEDS的使用
1、普通安装步骤:
git clone https://github.com/rep/hpfeeds/
cd hpfeeds
python setup.py build
python setup.py install
2、代码分析
Hpfeeds协议server与client的通讯主要是使用TCP套接字的方式。
http://www.cnblogs.com/lijingchn/p/5566662.html
网友评论