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,该文件在再次运行脚本时加载。如果 您需要更改任何内容来编辑该文件。

脚本将经历许多步骤:

    检查设备的存在并删除设备是否存在
  1. 在后端注册设备
  2. 为该设备生成新标识并将其存储在密钥存储库中
  3. 在后端注册新标识
  4. 向后端发送两个连续的链接消息

示例:信任网

在第一次执行之前
python3 -m venv venv3
pip install -r requirements.txt

运行示例
. 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

许可证

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javai是JAXB的新手。如何将两个具有不同名称空间的不同xml合并为一个具有根元素的xml并将其解组?   JDO中的java应该是可传递的DefaultFetchGroup吗   java服务器配置问题   java在理解JList时遇到困难   java何时将RequestContextFilter用于Jersey?   java从数据库中读取文本文件。jar文件   Java正则表达式,仅适用于不包括零的正数   爪哇番石榴。类路径中的jar   JavaEE:关于设计的问题   java GUI,在面板中排列按钮   java Android为什么使用接口被认为是活动和片段之间通信的最佳实践?   java如何获取wicket图像的url以在开放图元标记中使用它   从Java字节[]>Base64>Javascript数组缓冲>Base64>byte[]   java正则表达式帮助字符串JWE766。1.pdf格式摘录766   java Hibernate,JPA忽略@Formula