问题
我正在开发一个移动应用程序,其中用户 A
应实际向用户 B
交付某些内容,而用户 A
必须证明它已交付。
有一个限制:
- 用户 A 或用户 B 在交付时可能处于离线状态,因此不能依赖互联网连接
我的方法
我考虑过使用密码学来解决这个问题:
安排交货后,会发生以下过程:
- 生成 key 对并将其存储在数据库中。
- 私钥属于
用户 B
,应转移到他的移动应用。 - 某些
wellknown+delivery_uuid
字符串使用公钥加密,并传输给用户A
。 - 用户 A 仅在交付时显示加密代码(以 QRCode 形式)。
- 用户 B 面向配送时使用移动应用读取 QRCode。
- 由于加密消息以
众所周知
字符串开头,因此用户 B
移动应用可以对其进行解密并验证该消息是否正常。如果有效,应用程序会存储delivery_uuid
部分,并在用户访问互联网后立即发送到服务器端进行跟踪。 - 如果
用户 B
尝试伪造delivery_uuid
,它显然不会匹配。 - 如果
用户 A
尝试伪造 QRCode,用户 B
的应用将无法验证该消息。
担忧
- 每条加密消息中都存在
众所周知的
片段,这一事实会使其变得更弱吗?考虑到 key 对仅使用一次。 - 公钥不应对任何人可见。只有后端必须使用它来创建送达证明消息。显然同样适用于
delivery_uuid
- 糟糕的事情发生了。如果用户 B 移动应用在发送到后端之前因某种原因崩溃并丢失了
delivery_uuid
,则用户 B
将需要依赖用户 A
诚实。 - 我的 key 必须有多坚固?考虑到该套餐的货币值(value)较低。在这种情况下,RSA 是更好的加密吗?
我真的知道这个问题很复杂,但如果有人可以帮助我,我真的很感激。
注意:我不确定 Stackoverflow 是否是询问此问题的正确 stackexchange 社区,如果偏离主题,请发表评论。但由于它有一定的逻辑性,我认为这是正确的地方。
最佳答案
好像有点复杂。为什么不呢
UserB(以及安装该应用程序以接收送货的每个用户)都会获得一个公钥/私钥对。私钥仅由UserB持有;如果丢失,可以发行新的一对。同时,公钥是公开的,并且与UserB的身份一起存储在数据库中。
收到包裹后,用户 B 生成一个简单的文本文档,其中包含日期和时间、二维码、接收包裹的人的姓名或任何需要的信息。该文档还包含公钥。任何格式都可以。
UserB 使用其私钥对文档进行签名,并将签名附加到文档末尾。现在您有了一份明文文档,详细说明了所发生的一切,并证明 UserB 同意。
用户 B 与用户 A 共享文档,和/或将其上传到任何需要的地方,例如:记录系统。 UserA和UserB都可以保留离线副本。
如果需要交付证明,用户A只需出示签名的文件即可。
关于security - 使用公钥/私钥对作为交付证明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49640987/