问题

我正在开发一个移动应用程序,其中 user A 应该 物理上 user B 交付一些东西,并且用户 A 必须证明交付了它。

有一个限制:

  • 用户 A 或用户 B 可能在交付时离线,因此它不能依赖互联网连接

  • 我的方法

    我想过用密码学来解决这个问题:

    安排交货时,会发生以下过​​程:
  • 生成 key 对并存储在数据库中。
  • 私钥属于 User B ,应该转移到他的移动应用程序中。
  • 一些 well-known+delivery_uuid 字符串使用公钥加密,并传输到 User A
  • 用户 A 被定向为仅在交付发生时显示加密代码(以二维码的形式)。
  • 用户 B 定向为在交付时使用移动应用程序读取 QRCode。
  • 由于加密消息以 well-known 字符串开头,因此 User B 移动应用程序可以对其进行解密并验证消息是否正确。应用程序存储 delivery_uuid 部分(如果有效),并在用户访问互联网后立即发送到服务器端以进行跟踪。
  • 如果 User B 试图伪造 delivery_uuid ,它显然不会匹配。
  • 如果 User A 试图伪造 QRCode,则 User B 的应用程序将无法验证消息。

  • 顾虑
  • 每个加密消息中都存在 well-known 片段的事实会使它变弱吗?考虑到 key 对只使用一次。
  • 任何人都不应看到公钥。只有后端必须使用它来创建交付证明消息。同样显然适用于 delivery_uuid
  • Sh*t 发生了。如果用户 B 移动应用程序在将其发送到后端之前以某种方式崩溃并丢失 delivery_uuid,则 user B 将需要依赖 user A 诚实。
  • 我的 key 必须有多强?考虑到包裹的货币值(value)很低。在这种情况下,RSA 是更好的加密吗?

  • 我真的知道这个问题很复杂,但如果有人可以帮助我,我真的很感激。

    注意:我不确定 Stackoverflow 是询问这个问题的合适的 stackexchange 社区,如果它偏离主题,请发表评论。但因为它有一些关于逻辑的东西,我认为这是正确的地方。

    最佳答案

    好像有点复杂。为什么不

  • UserB(以及安装该应用程序以接收交付的每个用户)都会获得一个公钥/私钥对。私钥仅由UserB持有;如果丢失,可以发行新的一对。同时,公钥是公开的,与用户B的身份一起存储在数据库中。
  • 收到包裹后,用户 B 生成一个简单的文本文档,其中包含日期和时间、二维码、收货人的姓名或任何需要的信息。该文档还包含公钥。任何格式都可以。
  • UserB 使用他的私钥对文档进行签名,并将签名附加到文档的末尾。现在您有一个明文文档,详细说明了所发生的一切,并证明用户 B 同意它。
  • UserB 与 UserA 共享文档,和/或将其上传到任何需要的地方,例如记录系统。 UserA 和 UserB 都可以保留脱机副本。
  • 如果需要交付证明,用户 A 只需要出示签名文件。
  • 关于security - 使用公钥/私钥对作为交付证明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49640987/

    10-10 14:55