omemo多端消息和对象加密协议的python实现。
OMEMO的Python项目详细描述
python omemo
omemo多端消息和对象加密协议的python实现。
这个python库提供了一个开放的omemo多端消息和对象加密协议的实现,如这里指定的
实施的目标是:
- 不要依赖libsignal,而是提供一个可靠的替代方案
- 远离GPL(此回购协议将很快切换到麻省理工学院)
- 灵活应对Omemo协议可能发生的更改
- 使结构接近规范
- 将协议的部分(x3dh,双棘轮)作为自己的项目提供
此库使用x3dh和doublecratchet库,使用omemo使用的参数配置它们,并为您管理所有加密会话。
此库不管理XML/节。
安装
PIP
您可以通过pip:
$ pip install OMEMO
AUR
ppjet6请维护当前主版本和最新版本的AUR包:
<表><广告>用法
选择后端
要使用此库,必须先选择后端。目前,您没有太多选择:唯一可用的后端是提供libsignal兼容性的后端,可以在这里找到。安装您选择的后端并继续下一步。
实现存储接口
库中有许多状态/数据必须在运行之间保持。为了尽可能灵活,库将为您开放以决定如何存储数据。只需实现storage
中的storage
接口。该文件包含有关如何实现接口的更多信息。
决定一次性预密钥策略
这部分有点棘手,因为它需要很多关于E协议有效。基本上,协议使用的密钥交换机制假定有保证的消息传递和在发送另一个消息之前对第一个消息的响应。这两个条件并不是在所有环境中都给出的,特别是在xmpp中,xmpp是这个库的主要用例。因此,图书馆必须"放松"一些协议规则。与其总是立即删除密钥交换中使用的密钥,现在由您决定是否保留密钥。为此,请实现otpkpolicy.py
中的otpkpolicy
接口,或使用默认实现defaultotpkpolicy
。如果您决定自己实现接口,则otpkpolicy.py
文件包含有关如何实现接口的更多信息。
创建会话管理器
现在您已经选择了一个后端,决定了如何存储数据以及何时删除密钥交换密钥,现在是创建这个库的核心类的实例的时候了:sessionmanager。
sessionmanager处理所有联系人的消息en-和解密,试图使其尽可能简单。文件examples/sessions.py
包含许多注释良好的代码,这些代码显示了如何创建和使用sessionmanager。
xmpp/jabber中使用的特定信息
<H3>1。设备列表管理 <H4>1.1。联系人的设备列表首先要设置的是设备列表管理。要做到这一点,请订阅"eu.siacs.conversations.axolotl.devicelist"节点(或在xep-0163中订阅)。现在您将收到所有启用omemo的联系人的设备列表的更新。收到这样的更新后,将包含的列表传递到sessionmanager的"newdevicelist"方法中。一些伪代码:
DEVICELIST_NODE="eu.siacs.conversations.axolotl.devicelist"def__init__():xep0163.announce_interest(DEVICELIST_NODE)defonPEPUpdate(node,item,sender_jid):ifnode==DEVICELIST_NODE:devices=unpackDeviceList(item)sessionMgr.newDeviceList(devices,sender_jid)
sessionmanager负责缓存设备列表,并为您记住不活动的设备。您可以使用"getdevices"方法向sessionmanager请求存储的设备列表。
<H4>1.2。您自己的设备列表接下来要设置的是管理自己的设备列表。规则很简单:始终确保您自己的设备ID包含在设备列表中。每当你使用软件加载你的omemo时,下载你自己jid的设备列表,并确保包含了你自己的设备id。按照1.1.中的步骤操作后,您现在还将收到有关您自己设备列表更改的PEP更新。使用这些更新来断言列表中仍包含您自己的设备ID。还有一些伪代码:
def__init__():own_device_list=xep0163.load_latest_entry(own_jid,DEVICELIST_NODE)manageOwnDeviceList(own_device_list)sessionMgr.newDeviceList(own_device_list,own_jid)defonPEPUpdate(node,item,sender_jid):ifnode==DEVICELIST_NODE:devices=unpackDeviceList(item)ifsender_jid==own_jid:manageOwnDeviceList(devices)sessionMgr.newDeviceList(devices,sender_jid)defmanageOwnDeviceList(devices):ifnotown_deviceindevices:devices.append(own_device)item=packDeviceList(devices)xep0163.publish(DEVICELIST_NODE,item)<H3>2。捆绑管理
接下来需要管理的是用于x3dh密钥交换的包。每个设备都将自己的捆绑包发布到一个唯一的pep节点。
在制品 <H3>3。解密 <H3>4。加密 <H3>5。关于信任管理的说明 <H3>6。关于指纹的说明
指纹最初是图书馆的一部分,但我决定把它们去掉。指纹根本没有指定,这就是为什么我让客户端开发人员决定构建和显示指纹的方法。有些实现只需获取标识密钥的公共部分,并将其显示为二维码或编码为十六进制字节。伪码:
# Get the ik public part from some bundleik_pub=some_bundle.ik# Show a qr code somehow...showQRCode(ik_pub)# ...or create a hex byte representation# Wanted format: 01:23:45:67:89:AB:CD:EF# This is surprisingly tricky:importcodecsimportreik_pub_hex=codecs.getencoder("hex")(ik_pub)[0].decode("US-ASCII").upper()ik_pub_hex=":".join(re.findall("..?",ik_pub_hex))<H3>7。关于异步性的注记