.. _py-futu-api: ../api/intro.html
协议接口
====================
+ FutuOpenD是futu-api项目的网关客户端,在本机或云端成功运行后,第三方应用即可通过约定的TCP协议与之通讯,从而达到调用指定行情和交易接口的目的。
+ py-futu-api_ 可以简化在python编程上协议通讯的复杂度,其他语言接口正在陆续开发中……
--------------
.. _nProtoFmtType: #id8
.. _InitConnect: base_define.html#initconnect-proto-1001
.. _InitConnect.proto: base_define.html#initconnect-proto-1001
.. _GetGlobalState.proto: base_define.html#getglobalstate-proto-1002
.. _Notify.proto: base_define.html#notify-proto-1003
.. _KeepAlive.proto: base_define.html#keepalive-proto-1004
.. _KeepAlive: base_define.html#keepalive-proto-1004
.. _Trd_GetAccList.proto: trade_protocol.html#trd-getacclist-proto-2001
.. _Trd_UnlockTrade.proto: trade_protocol.html#trd-unlocktrade-proto-2005
.. _2005: trade_protocol.html#trd-unlocktrade-proto-2005
.. _Trd_SubAccPush.proto: trade_protocol.html#trd-subaccpush-proto-2008
.. _Trd_GetFunds.proto: trade_protocol.html#trd-getfunds-proto-2101
.. _Trd_GetPositionList.proto: trade_protocol.html#trd-getpositionlist-proto-2102
.. _Trd_GetMaxTrdQtys.proto: trade_protocol.html#trd-getmaxtrdqtys-proto-2111
.. _2111: trade_protocol.html#trd-getmaxtrdqtys-proto-2111
.. _Trd_GetOrderList.proto: trade_protocol.html#trd-getorderlist-proto-2201
.. _Trd_PlaceOrder.proto: trade_protocol.html#trd-placeorder-proto-2202
.. _2202: trade_protocol.html#trd-placeorder-proto-2202
.. _Trd_ModifyOrder.proto: trade_protocol.html#trd-modifyorder-proto-2205
.. _2205: trade_protocol.html#trd-modifyorder-proto-2205
.. _Trd_UpdateOrder.proto: trade_protocol.html#trd-updateorder-proto-2208
.. _Trd_GetOrderFillList.proto: trade_protocol.html#trd-getorderfilllist-proto-2211
.. _Trd_UpdateOrderFill.proto: trade_protocol.html#trd-updateorderfill-proto-2218
.. _Trd_GetHistoryOrderList.proto: trade_protocol.html#trd-gethistoryorderlist-proto-2221
.. _2221: trade_protocol.html#trd-gethistoryorderlist-proto-2221
.. _Trd_GetHistoryOrderFillList.proto: trade_protocol.html#trd-gethistoryorderfilllist-proto-2222
.. _2222: trade_protocol.html#trd-gethistoryorderfilllist-proto-2222
.. _Qot_Sub.proto: quote_protocol.html#qot-sub-proto-3001
.. _3001: quote_protocol.html#qot-sub-proto-3001
.. _Qot_RegQotPush.proto: quote_protocol.html#qot-regqotpush-proto-3002
.. _Qot_GetSubInfo.proto: quote_protocol.html#qot-getsubinfo-proto-3003
.. _Qot_GetBasicQot.proto: quote_protocol.html#qot-getbasicqot-proto-3004
.. _Qot_UpdateBasicQot.proto: quote_protocol.html#qot-updatebasicqot-proto-3005
.. _Qot_GetKL.proto: quote_protocol.html#qot-getkl-proto-3006k
.. _3006: quote_protocol.html#qot-getkl-proto-3006k
.. _Qot_UpdateKL.proto: quote_protocol.html#qot-updatekl-proto-3007k
.. _Qot_GetRT.proto: quote_protocol.html#qot-getrt-proto-3008
.. _Qot_UpdateRT.proto: quote_protocol.html#qot-updatert-proto-3009
.. _Qot_GetTicker.proto: quote_protocol.html#qot-getticker-proto-3010
.. _3010: quote_protocol.html#qot-getticker-proto-3010
.. _Qot_UpdateTicker.proto: quote_protocol.html#qot-updateticker-proto-3011
.. _Qot_GetOrderBook.proto: quote_protocol.html#qot-getorderbook-proto-3012
.. _Qot_UpdateOrderBook.proto: quote_protocol.html#qot-updateorderbook-proto-3013
.. _Qot_GetBroker.proto: quote_protocol.html#qot-getbroker-proto-3014
.. _Qot_UpdateBroker.proto: quote_protocol.html#qot-updatebroker-proto-3015
.. _Qot_GetHistoryKL.proto: quote_protocol.html#qot-gethistorykl-proto-3100k
.. _Qot_GetHistoryKLPoints.proto: quote_protocol.html#qot-gethistoryklpoints-proto-3101k
.. _Qot_GetRehab.proto: quote_protocol.html#qot-getrehab-proto-3102
.. _Qot_RequestRehab.proto: quote_protocol.html#qot-requestrehab-proto-3105
.. _3105: quote_protocol.html#qot-requestrehab-proto-3105
.. _Qot_RequestHistoryKL.proto: quote_protocol.html#qot-requesthistorykl-proto-3103k
.. _3103: quote_protocol.html#qot-requesthistorykl-proto-3103k
.. _Qot_GetTradeDate.proto: quote_protocol.html#qot-gettradedate-proto-3200
.. _Qot_GetStaticInfo.proto: quote_protocol.html#qot-getstaticinfo-proto-3202
.. _Qot_GetSecuritySnapshot.proto: quote_protocol.html#qot-getsecuritysnapshot-proto-3203
.. _3203: quote_protocol.html#qot-getsecuritysnapshot-proto-3203
.. _Qot_GetPlateSet.proto: quote_protocol.html#qot-getplateset-proto-3204
.. _3204: quote_protocol.html#qot-getplateset-proto-3204
.. _Qot_GetPlateSecurity.proto: quote_protocol.html#qot-getplatesecurity-proto-3205
.. _3205: quote_protocol.html#qot-getplatesecurity-proto-3205
.. _Qot_GetReference.proto: quote_protocol.html#qot-getreference-proto-3206
.. _3206: quote_protocol.html#qot-getreference-proto-3206
.. _Qot_GetOwnerPlate.proto: quote_protocol.html#qot-getownerplate-proto-3207
.. _3207: quote_protocol.html#qot-getownerplate-proto-3207
.. _Qot_GetHoldingChangeList.proto: quote_protocol.html#qot-getholdingchangelist-proto-3208
.. _3208: quote_protocol.html#qot-getholdingchangelist-proto-3208
.. _Qot_GetOptionChain.proto: quote_protocol.html#qot-getoptionchain-proto-3209
.. _3209: quote_protocol.html#qot-getoptionchain-proto-3209
.. _SubType: base_define.html#subtype
.. _Qot_GetWarrant.proto: quote_protocol.html#qot-getwarrant-proto-3210
.. _3210: quote_protocol.html#qot-getwarrant-proto-3210
.. _Qot_GetCapitalFlow.proto: quote_protocol.html#qot-getcapitalflow-proto-3211
.. _3211: quote_protocol.html#qot-getcapitalflow-proto-3211
.. _Qot_GetCapitalDistribution.proto: quote_protocol.html#qot-getcapitaldistribution-proto-3212
.. _3212: quote_protocol.html#qot-getcapitaldistribution-proto-3212
.. _Qot_GetUserSecurity.proto: quote_protocol.html#qot-getusersecurity-proto-3213
.. _3213: quote_protocol.html#qot-getusersecurity-proto-3213
.. _Qot_ModifyUserSecurity.proto: quote_protocol.html#qot-modifyusersecurity-proto-3214
.. _3214: quote_protocol.html#qot-modifyusersecurity-proto-3214
.. _Qot_StockFilter.proto: quote_protocol.html#qot-stockfilter-proto-3215
.. _3215: quote_protocol.html#qot-stockfilter-proto-3215
.. role:: red-strengthen
特点
-------
+ 基于TCP传输协议实现,稳定高效。
+ 支持protobuf/json两种协议格式, 灵活接入。
+ 协议设计支持加密、数据校验及回放功击保护,安全可靠。
---------------------------------------------------
协议清单
----------
============== ================================== ==================================================================
协议ID Protobuf文件 说明
============== ================================== ==================================================================
1001 InitConnect.proto_ 初始化连接
1002 GetGlobalState.proto_ 获取全局状态
1003 Notify.proto_ 系统通知推送
1004 KeepAlive.proto_ 保活心跳
2001 Trd_GetAccList.proto_ 获取业务账户列表
2005 Trd_UnlockTrade.proto_ 解锁或锁定交易
2008 Trd_SubAccPush.proto_ 订阅业务账户的交易推送数据
2101 Trd_GetFunds.proto_ 获取账户资金
2102 Trd_GetPositionList.proto_ 获取账户持仓
2111 Trd_GetMaxTrdQtys.proto_ 获取最大交易数量
2201 Trd_GetOrderList.proto_ 获取订单列表
2202 Trd_PlaceOrder.proto_ 下单
2205 Trd_ModifyOrder.proto_ 修改订单
2208 Trd_UpdateOrder.proto_ 推送订单状态变动通知
2211 Trd_GetOrderFillList.proto_ 获取成交列表
2218 Trd_UpdateOrderFill.proto_ 推送成交通知
2221 Trd_GetHistoryOrderList.proto_ 获取历史订单列表
2222 Trd_GetHistoryOrderFillList.proto_ 获取历史成交列表
3001 Qot_Sub.proto_ 订阅或者反订阅
3002 Qot_RegQotPush.proto_ 注册推送
3003 Qot_GetSubInfo.proto_ 获取订阅信息
3004 Qot_GetBasicQot.proto_ 获取股票基本报价
3005 Qot_UpdateBasicQot.proto_ 推送股票基本报价
3006 Qot_GetKL.proto_ 获取K线
3007 Qot_UpdateKL.proto_ 推送K线
3008 Qot_GetRT.proto_ 获取分时
3009 Qot_UpdateRT.proto_ 推送分时
3010 Qot_GetTicker.proto_ 获取逐笔
3011 Qot_UpdateTicker.proto_ 推送逐笔
3012 Qot_GetOrderBook.proto_ 获取买卖盘
3013 Qot_UpdateOrderBook.proto_ 推送买卖盘
3014 Qot_GetBroker.proto_ 获取经纪队列
3015 Qot_UpdateBroker.proto_ 推送经纪队列
3100 Qot_GetHistoryKL.proto_ 从本地下载历史数据获取单只股票一段历史K线
3101 Qot_GetHistoryKLPoints.proto_ 从本地下载历史数据获取多只股票多点历史K线
3102 Qot_GetRehab.proto_ 从本地下载历史数据获取复权信息
3103 Qot_RequestHistoryKL.proto_ 在线获取单只股票一段历史K线
3105 Qot_RequestRehab.proto_ 在线获取单只股票复权信息
3200 Qot_GetTradeDate.proto_ 获取市场交易日
3202 Qot_GetStaticInfo.proto_ 获取股票静态信息
3203 Qot_GetSecuritySnapshot.proto_ 获取股票快照
3204 Qot_GetPlateSet.proto_ 获取板块集合下的板块
3205 Qot_GetPlateSecurity.proto_ 获取板块下的股票
3206 Qot_GetReference.proto_ 获取正股相关股票
3207 Qot_GetOwnerPlate.proto_ 获取股票所属板块
3208 Qot_GetHoldingChangeList.proto_ 获取持股变化列表
3209 Qot_GetOptionChain.proto_ 获取期权链
3210 Qot_GetWarrant.proto_ 获取涡轮
3211 Qot_GetCapitalFlow.proto_ 获取资金流向
3212 Qot_GetCapitalDistribution.proto_ 获取资金分布
3213 Qot_GetUserSecurity.proto_ 获取自选股分组下的股票
3214 Qot_ModifyUserSecurity.proto_ 修改自选股分组下的股票
3215 Qot_StockFilter.proto_ 获取条件选股
============== ================================== ==================================================================
.. note::
* 所有 Protobuf 文件可从 `futu-api `_ Python开源项目下获取
---------------------------------------------------
协议请求限制
---------------
API用户等级
~~~~~~~~~~~~~~~~~~~~~~
部分协议的请求限制与API用户等级相关,划分如下:
+ 用户净资产大于10000港币为二级用户
+ 小于10000港币为三级用户
+ 一级用户提供给有一定交易额的实盘交易用户,可与富途联系获取
解锁或锁定交易
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 协议ID: 2005_
* :red-strengthen:`30` 秒内请求次数最多 :red-strengthen:`10` 次
获取最大交易数量
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 协议ID: 2111_
* :red-strengthen:`30` 秒内请求次数最多 :red-strengthen:`10` 次
下单
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 2202_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`15` 次,同时 :red-strengthen:`1` 秒内最多 :red-strengthen:`5` 次
修改订单
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 2205_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`20` 次,同时 :red-strengthen:`1` 秒内最多 :red-strengthen:`5` 次
获取历史订单列表
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 2221_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
获取历史成交列表
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 2222_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
订阅反订阅
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3001_
* 支持多种实时数据类型的定阅,参见 SubType_ , 每支股票订阅一个类型占用一个额度。
* 订阅额度上限与用户等级相关,一级: :red-strengthen:`1000`, 二级: :red-strengthen:`300` , 三级: :red-strengthen:`100`
* 至少订阅一分钟才可以反订阅。
获取K线
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3006_
* 最多能获取最近 :red-strengthen:`1000` 根
* 市盈率,换手率字段只有日K及日K以上周期的正股才有数据。
获取逐笔
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3010_
* 最多能获取最近 :red-strengthen:`1000` 根
在线获取单只股票一段历史K线
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3103_
* 30天内在线获取历史K线最多可请求股票数与用户等级相关,一级: :red-strengthen:`1000` , 二级: :red-strengthen:`300` , 三级: :red-strengthen:`100`
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次,可分页的请求,第1页限频,后续页请求不限频
* 分K提供最近2年数据,日K及以上提供近10年数据。
在线获取单只股票复权信息
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3105_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
获取股票快照
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3203_
* 每次最多可请求股票数与用户等级相关, 一级: :red-strengthen:`400` , 二级: :red-strengthen:`300` , 三级: :red-strengthen:`200`
* 30秒内快照最多请求次数与用户等级相关,一级: :red-strengthen:`30` , 二级: :red-strengthen:`20` , 三级: :red-strengthen:`10`
获取板块集合下的板块
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3204_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
获取板块下的股票
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3205_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
获取板块下的股票
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3205_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
获取股票所属板块
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3207_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 传入股票最多 :red-strengthen:`200` 个
* 仅支持正股和指数
获取持股变化列表
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3208_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 最多返回前 :red-strengthen:`100` 大股东的变化
* 仅支持美股
获取期权链
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3209_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 传入时间跨度最多 :red-strengthen:`30` 天
获取涡轮
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3210_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 每次请求的数据个数最多 :red-strengthen:`200` 个
* 仅支持港股
获取资金流向
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3211_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 仅支持正股、涡轮和基金
获取资金分布
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3212_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 仅支持正股、涡轮和基金
获取自选股分组下的股票
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3213_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 仅支持自定义分组
修改自选股分组下的股票
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3214_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 仅支持自定义分组
* 自选股的上限,一般最多是 :red-strengthen:`500` 支股票。
* 如果有同名的分组,会返回排序第一个分组的信息。
* 用户分组的删除操作,只做本组的移除操作,系统分组的“全部”分组下股票的数量并不会减少。
获取条件选股
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 3215_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 每次请求的数据个数最多 :red-strengthen:`200` 个
获取账户资金
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 2101_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 仅当refreshCache为True时限制频率
获取账户持仓
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 2102_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 仅当refreshCache为True时限制频率
获取成交列表
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 2211_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 仅当refreshCache为True时限制频率
获取账户持仓
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 请求协议ID: 2102_
* :red-strengthen:`30` 秒内请求最多 :red-strengthen:`10` 次
* 仅当refreshCache为True时限制频率
协议请求流程
-------------
* 建立连接
* 初始化连接
* 请求数据或接收推送数据
* 定时发送 KeepAlive_ 保持连接
.. image:: ../_static/proto.png
--------------
协议设计
---------
协议数据包括协议头以及协议体,协议头固定字段,协议体根据具体协议决定。
协议头结构
~~~~~~~~~~~~~~~
.. code-block:: bash
struct APIProtoHeader
{
u8_t szHeaderFlag[2];
u32_t nProtoID;
u8_t nProtoFmtType;
u8_t nProtoVer;
u32_t nSerialNo;
u32_t nBodyLen;
u8_t arrBodySHA1[20];
u8_t arrReserved[8];
};
============== ==================================================================
字段 说明
============== ==================================================================
szHeaderFlag 包头起始标志,固定为“FT”
nProtoID 协议ID
nProtoFmtType 协议格式类型,0为Protobuf格式,1为Json格式
nProtoVer 协议版本,用于迭代兼容, 目前填0
nSerialNo 包序列号,用于对应请求包和回包, 要求递增
nBodyLen 包体长度
arrBodySHA1 包体原始数据(解密后)的SHA1哈希值
arrReserved 保留8字节扩展
============== ==================================================================
.. note::
* u8_t表示8位无符号整数,u32_t表示32位无符号整数
* FutuOpenD内部处理使用Protobuf,因此协议格式建议使用Protobuf,减少Json转换开销
* nProtoFmtType字段指定了包体的数据类型,回包会回对应类型的数据;推送协议数据类型由FutuOpenD配置文件指定
* **arrBodySHA1用于校验请求数据在网络传输前后的一致性,必须正确填入**
* **协议头的二进制流使用的是小端字节序,即一般不需要使用ntohl等相关函数转换数据**
---------------------------------------------------
协议体结构
~~~~~~~~~~~
**Protobuf协议请求包体结构**
.. code-block:: bash
message C2S
{
required int64 req = 1;
}
message Request
{
required C2S c2s = 1;
}
**Protobuf协议回应包体结构**
.. code-block:: bash
message S2C
{
required int64 data = 1;
}
message Response
{
required int32 retType = 1 [default = -400]; //RetType,返回结果
optional string retMsg = 2;
optional int32 errCode = 3;
optional S2C s2c = 4;
}
**Json协议请求包体结构**
.. code-block:: bash
{
"c2s":
{
"req": 0
}
}
**Json协议回应包体结构**
.. code-block:: bash
{
"retType" : 0
"retMsg" : ""
"errCode" : 0
"s2c":
{
"data": 0
}
}
---------
============== ==================================================================
字段 说明
============== ==================================================================
c2s 请求参数结构
req 请求参数,实际根据协议定义
retType 请求结果
retMsg 若请求失败,说明失败原因
errCode 若请求失败对应错误码
s2c 回应数据结构,部分协议不返回数据则无该字段
data 回应数据,实际根据协议定义
============== ==================================================================
.. note::
* 包体格式类型请求包由协议头 nProtoFmtType_ 指定, FutuOPenD主动推送格式参见 `FutuOpenD配置 `_ 约定的 “push_proto_type“ 配置项
* 原始协议文件格式是以Protobuf格式定义,若需要json格式传输,建议使用protobuf3的接口直接转换成json
* 枚举值字段定义使用有符号整形,注释指明对应枚举,枚举一般定义于Common.proto,Qot_Common.proto,Trd_Common.proto文件中
* **协议中价格、百分比等数据用浮点类型来传输,直接使用会有精度问题,需要根据精度(如协议中未指明,默认小数点后三位)做四舍五入之后再使用**
---------------------------------------------------
加密通信流程
~~~~~~~~~~~~~~~
* 若FutuOpenD配置了加密, InitConnect_ 初始化连接协议必须使用RSA公钥加密,后续其他协议使用 InitConnect_ 返回的随机密钥进行AES加密通信。
* FutuOpenD的加密流程借鉴了SSL协议,但考虑到一般是本地部署服务和应用,简化了相关流程,FutuOpenD与接入Client共用了同一个RSA 私钥文件,请妥善保存和分发私钥文件。
* 可到"http://web.chacuo.net/netrsakeypair"这个网址在线生成随机RSA密钥对,密钥格式必须为PCKS#1,密钥长度512,1024都可以,不要设置密码,将生成的私钥复制保存到文件中,然后将私钥文件路径配置到 `FutuOpenD配置 `_ 约定的 “rsa_private_key”配置项中
*
* **强烈建议有实盘交易的用户配置加密,避免账户和交易信息泄露**
.. image:: ../_static/encrypt.png
---------------------------------------------------
RSA加解密
~~~~~~~~~~~~~~~~~~~
* `FutuOpenD配置 `_ 约定"rsa_private_key"为私钥文件路径
* FutuOpenD 与接入客户端共用相同的私钥文件
* RSA加解密仅用于 InitConnect_ 请求,用于安全获取其它请求协议的对称加密Key
* FutuOpenD的RSA密钥为1024位, 填充方式PKCS1, 公钥加密,私钥解密,公钥可通过私钥生成
* Python API 参考实现: `RsaCrypt `_ 类的encrypt / decrypt 接口
**发送数据加密**
* RSA加密规则:若密钥位数是key_size, 单次加密串的最大长度为 (key_size)/8 - 11, 目前位数1024, 一次加密长度可定为100
* 将明文数据分成一个或数个最长100字节的小段进行加密,拼接分段加密数据即为最终的Body加密数据
**接收数据解密**
* RSA解密同样遵循分段规则,对于1024位密钥, 每小段待解密数据长度为128字节
* 将密文数据分成一个或数个128字节长的小段进行解密,拼接分段解密数据即为最终的Body解密数据
-------------------------------------------------------------
AES加解密
~~~~~~~~~~~~~~~~~~~
* 加密key由 InitConnect_ 协议返回
* 使用的是AES的ecb加密模式。
* Python API 参考实现: `FutuConnMng `_ 类的encrypt_conn_data / decrypt_conn_data 接口
**发送数据加密**
* AES加密要求源数据长度必须是16的整数倍, 故需补‘\0'对齐后再加密,记录mod_len为源数据长度与16取模值
* 因加密前有可能对源数据作修改, 故需在加密后的数据尾再增加一个16字节的填充数据块,其最后一个字节赋值mod_len, 其余字节赋值'\0', 将加密数据和额外的填充数据块拼接作为最终要发送协议的body数据
**接收数据解密**
* 协议body数据, 先将最后一个字节取出,记为mod_len, 然后将body截掉尾部16字节填充数据块后再解密(与加密填充额外数据块逻辑对应)
* mod_len 为0时,上述解密后的数据即为协议返回的body数据, 否则需截掉尾部(16 - mod_len)长度的用于填充对齐的数据
.. image:: ../_static/AES.png