龙空技术网

ZeroMQ及其安全通信机制简介

张三石4468 286

前言:

此时看官们对“zeromq qt”都比较注重,朋友们都想要分析一些“zeromq qt”的相关文章。那么小编同时在网络上汇集了一些有关“zeromq qt””的相关知识,希望你们能喜欢,朋友们一起来了解一下吧!

1. ZeroMQ

ZeroMQ(以下ZeroMQ简称ZMQ)是由i Matix公司开发的一款开源的消息中间件。最初的设计目标是在股票交易系统中实现极快的数据交换, 所以性能是设计的首要考虑因素。ZeroMQ目前已经在很广泛的范围内获得使用, 包括:金融服务、游戏开发、嵌入式系统、科学研究, 以及航天系统中。

ZMQ是一个简单好用的传输层,像框架一样的一个socket 库,它使得Socket编程更加简单、简洁和性能更高。ZMQ是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。

ZMQ可以通过发布-订阅、任务分发、和请求-回复等模式来建立 N-N 的 Socket连接。 ZeroMQ 的异步 I / O 模型为我们提供可扩展的基于异步消息处理任务的多核应用程序。 它有一系列语言API(几乎囊括所有编程语言),并能够在大多数操作系统上运行。

图1 ZMQ三种基本的通信模型

· Request-Reply(请求-回复)

以 "Hello World" 为例。客户端发起请求,并等待服务端回应请求。客户端发送一个简单的 "Hello",服务端则回应一个 "World"。可以有 N 个客户端,一个服务端,因此是 1-N 连接。

· Publish-Subscribe(发布-订阅)

以一个天气预报的例子来介绍该模式,服务端不断地更新各个城市的天气,客户端可以订阅自己感兴趣(通过一个过滤器)的城市的天气信息。

· Parallel Pipeline

Parallel Pipeline 处理模式如下:

· ventilator 分发任务到各个 worker;

· 每个 worker 执行分配到的任务;

· 最后由 sink 收集从 worker 发来的结果。

2. CurveZMQ

CurveZMQ是一个基于CurveCP的协议,为ZMQ提供安全消息通信,以适应更多的应用场景。CurveZQM可以工作应用层(在libzmq的API之上),也可以在libzmq内部调用,对应用透明。

CurveZMQ使用Curve25519椭圆曲线提供非对称运算,该曲线是由丹尼尔·J·伯恩斯(英语 : Daniel J. Bernstein)Daniel J. Bernstein于2006年设计的,可以在256bits密钥的情形下,有更高的性能,与目前广泛使用的NIST 系列标准椭圆曲线相比Curve25519椭圆曲线设计更加开放安全。在运行过程中会生成Curve25519椭圆曲线的长期公私密钥对和临时密钥对,基于Diffie-Hellman运算得到握手阶段的临时共享密钥和消息保护阶段的共享会话密钥。

CurveZMQ使用流密码XSalsa20的加密认证模式(AEAD)提供握手阶段和消息通信阶段的机密性和完整性保护。Salsa20使用64比特nonce,XSalsa20使用192比特 nonce。Salsa20是一种流加密算法,由丹尼尔·J·伯恩斯坦提交到 eSTREAM。2004年ECRYPT启动了eSTREAM流密码计划的研究项目Salsa20是最终胜出的7个算法之一。Salsa20是基于hash函数设计的流密码算法,其核心部分是一个基于32比特加、比特异或以及旋转操作的512比特输入512比特输出的hash函数。

Libzmq使用的密码函数库是TweetNaCl。TweetNaCl是一个在 100 条推特内 (14000字) 内实现的加密库,TweetNaCl 仅包含一对 .h/.c 文件,但是实现了 NaCl 的 25 个主要方法,提供了以下功能:不对称加密 (x25519-xsalsa20-poly1305),对称加密 (xsalsa20-poly1305),签名 (ed25519),哈希 (sha512)。

CurveZMQ分为握手阶段和消息保护阶段。握手阶段由HELLO、WELCOME、INITIATE、READY四个交互过程完成,握手完成后,双方共享数据保护密钥,使用数据保护密钥对ZMQ各种模式的通信消息进行保护。

图2 CurveZMQ 握手协议及通信消息流程

CurveZMQ协议可以抵抗中间人攻击、重放攻击、在线监听、数据修改等常见的攻击,具有良好的安全特性。

CurveZMQ的应用场景:

· 保护客户端和服务端直接通信,即中间不需要通过别的阶段转发。这种情形下,CurveZMQ对应用层透明,直接在libzmq库中执行,可用于ZMQ的各种通信模式(publish-subscribe, pipeline, 等)。

· 保护客户端和服务端跨越多个不可信节点时的通信,这时需要在应用层协议使用CurveZMQ进行异步请求应答(request-reply)通信模式。

下面使用ABNF语法描述Curve ZMQ协议过程。

curvezmq = C:hello ( S:welcome | S:error )

C:initiate ( S:ready | S:error )

*message

; HELLO command, 200 octets

hello = %d5 "HELLO" hello-version hello-padding hello-client hello-nonce hello-box

hello-version = %x1 %x0 ; CurveZMQ major-minor version

hello-padding = 72%x00 ; Anti-amplification padding

hello-client = 32OCTET ; Client public transient key C'

hello-nonce = 8OCTET ; Short nonce, prefixed by "CurveZMQHELLO---"

hello-box = 80OCTET ; Signature, Box [64 * %x0](C'->S)

; WELCOME command, 168 octets

welcome = %d7 "WELCOME" welcome-nonce welcome-box

welcome-nonce = 16OCTET ; Long nonce, prefixed by "WELCOME-"

welcome-box = 144OCTET ; Box [S' + cookie](S->C')

; This is the text sent encrypted in the box

cookie = cookie-nonce cookie-box

cookie-nonce = 16OCTET ; Long nonce, prefixed by "COOKIE--"

cookie-box = 80OCTET ; Box [C' + s'](K)

; INITIATE command, 257+ octets

initiate = %d8 "INITIATE" initiate-cookie initiate-nonce initiate-box

initiate-cookie = cookie ; Server-provided cookie

initiate-nonce = 8OCTET ; Short nonce, prefixed by "CurveZMQINITIATE"

initiate-box = 144*OCTET ; Box [C + vouch + metadata](C'->S')

; This is the text sent encrypted in the box

vouch = vouch-nonce vouch-box

vouch-nonce = 16OCTET ; Long nonce, prefixed by "VOUCH---"

vouch-box = 80OCTET ; Box [C',S](C->S')

metadata = *property

property = name value

name = OCTET *name-char

name-char = ALPHA | DIGIT | "-" | "_" | "." | "+"

value = value-size value-data

value-size = 4OCTET ; Size in network order

value-data = *OCTET ; 0 or more octets

; READY command, 30+ octets

ready = %d5 "READY" ready-nonce ready-box

ready-nonce = 8OCTET ; Short nonce, prefixed by "CurveZMQREADY---"

ready-box = 16*OCTET ; Box [metadata](S'->C')

; ERROR command, 7+ octetserror = %d5 "ERROR" error-reasonerror-reason = OCTET 0*255VCHAR; MESSAGE command, 33+ octetsmessage = %d7 "MESSAGE" message_nonce message-boxmessage-nonce = 8OCTET ; Short nonce, prefixed by "CurveZMQMESSAGE-"message-box = 17*OCTET ; Box [payload](S'->C') or (C'->S'); This is the text sent encrypted in the boxpayload = payload-flags payload-datapayload-flags = OCTET ; Explained belowpayload-data = *octet ; 0 or more octets

CurveZMQ协议过程中使用的密钥层次列表

标签: #zeromq qt