python的ubirch协议实现。
ubirch-protocol的Python项目详细描述
用于python的ubirch协议
这是ubirch-protocol的实现 对于Python 3。请看ubirch-protocol 详细情况。
库由三部分组成,可单独使用:
ubirch.API
-覆盖ubirch后端rest api的python层ubirch.Protocol
-打包消息并处理签名和验证的协议编译器ubirch.KeyStore
-一个基于pyjks的简单密钥存储,用于存储密钥和证书
the ubirch protocol uses the Ed25519 signature scheme by default.
用法
安装库:pip install ubirch-protocol
创建密钥对和消息
importubirchfromubirch.ubirch_protocolimportCHAINEDfromuuidimportUUIDimportbinascii# create a keystore for the device keypairkeystore=ubirch.KeyStore("demo-device.jks","keystore")# create a UUID that identifies the device and load or create a keypairuuid=UUID(hex="575A5601FD744F8EB6AEEF592CDEE12C")ifnotkeystore.exists_signing_key(uuid):keystore.create_ed25519_keypair(uuid)# implement the _sign method on the ubirch.Protocol to use the just created# keys to sign the message and add methods to save and load the last signatureclassProtocolImpl(ubirch.Protocol):def_sign(self,uuid:UUID,message:bytes)->bytes:returnkeystore.find_signing_key(uuid).sign(message)proto=ProtocolImpl(CHAINED)print(binascii.hexlify(proto.message_chained(uuid,0x00,[1,2,3])))print(binascii.hexlify(proto.message_chained(uuid,0x00,[4,5,6])))
使用ubirch api发送消息
有关如何创建设备和 发送数据。下面是一个剪贴,将发送两个链式消息,使用通用键/值有效负载。
您需要Ubirch后端的身份验证令牌。请随意contact us, 赛尔夫博丁在路上!
importubirchimportuuidimportbinasciifromdatetimeimportdatetimeuuid=uuid.uuid4()proto=ubirch.Protocol()api=ubirch.API()# message 1msg=proto.message_chained(uuid,0x53,{'ts':int(datetime.utcnow().timestamp()),'v':99})print(binascii.hexlify(msg))r=api.send(msg)print("{}: {}".format(r.status_code,r.content))# message 2 (chained to message 1)msg=proto.message_chained(uuid,0x53,{"ts":int(datetime.utcnow().timestamp()),"v":100})print(binascii.hexlify(msg))r=api.send(msg)print("{}: {}".format(r.status_code,r.content))
收到消息的验证
importubirchimporthashlibfromed25519importVerifyingKeyfromuuidimportUUIDfromubirch.ubirch_protocolimportSIGNEDremote_uuid=UUID(hex="6eac4d0b-16e6-4508-8c46-22e7451ea5a1")remote_vk=VerifyingKey("b12a906051f102881bbb487ee8264aa05d8d0fcc51218f2a47f562ceb9b0d068",encoding='hex')# a random signed ubirch-protocol messagekeystore=ubirch.KeyStore("demo-device.jks","keystore")keystore.insert_ed25519_verifying_key(remote_uuid,remote_vk)classProtocolImpl(ubirch.Protocol):def_verify(self,uuid:UUID,message:bytes,signature:bytes)->dict:hash=hashlib.sha512(message).digest()returnkeystore.find_verifying_key(uuid).verify(signature,hash)proto=ProtocolImpl(SIGNED)message=bytes.fromhex("9512b06eac4d0b16e645088c4622e7451ea5a1ccef01da0040578a5b22ceb3e1""d0d0f8947c098010133b44d3b1d2ab398758ffed11507b607ed37dbbe006f645""f0ed0fdbeb1b48bb50fd71d832340ce024d5a0e21c0ebc8e0e")print(proto.message_verify(message))
现有密钥< EH3>
如果您从我们的演示网站创建密钥对,请使用以下代码将其插入密钥库:
importubirchimported25519importuuidhwDeviceId=uuid.uuid4()keystore=ubirch.KeyStore("demo-device.jks","keystore")key_encoded=input("paste the encoded private key here:")sk=ed25519.SigningKey(key_encoded,encoding='hex')vk=sk.get_verifying_key()keystore.insert_ed25519_keypair(hwDeviceId,vk,sk)
运行示例
python3 -m venv venv3 . venv3/bin/activate pip install -r requirements.txt pip install ubirch-protocol PYTHONPATH=. python3 examples/test-protocol.py
在第一次启动时,脚本会为您的设备生成一个随机的uuid,并会询问您
关于身份验证令牌和设备组。您可以安全地忽略设备组,只需按回车键。
脚本创建一个文件demo-device.ini
,该文件在再次运行脚本时加载。如果
您需要更改任何内容来编辑该文件。
脚本将经历许多步骤:
- 在后端注册设备
- 为该设备生成新标识并将其存储在密钥存储库中
- 在后端注册新标识
- 向后端发送两个连续的链接消息
示例:信任网
在第一次执行之前
python3 -m venv venv3
pip install -r requirements.txt
运行示例
. venv3/bin/activate
PYTHONPATH=. python3 examples/test-web-of-trust.py
. venv3/bin/activate PYTHONPATH=. python3 examples/test-web-of-trust.py
在第一次启动期间,脚本为两个用户生成密钥对。每个用户有一个设备,并为其创建密钥对
这些也是。所有密钥对都存储在test-web-of-trust.jks
中,而用户、其设备和
各自的密钥对存储在demo-web-of-trust.ini
中。在连续运行中不会生成新的密钥对,而是
使用demo-web-of-trust.ini
中引用的那些。
脚本总是上载所有公钥,然后创建和上载信任的web并搜索所有公钥
受deviceA
信任的密钥。使用不同的参数重复此搜索。然后将结果打印到
终点站。
创建的信任网如下所示(信任知道方向;在本例中始终是双向的):
deviceA <--trustLevel=100--> user1 <--trustLevel=50--> user2 <--trustLevel=100--> deviceB
对所有受信任密钥的第一次搜索是最小信任度为50,深度为3,结果是 被发现:
- 用户1
- 用户2
- 设备B
第二次搜索将最小信任增加到60,结果是:
- 用户1
第三次搜索的最小信任度是50,而深度现在是2,结果是:
- 用户1
- 用户2
测试
添加单元测试是为了测试此库中提供的所有对象的功能。
pip install -r requirements.test.txt python3 -m pytest tests