security - 使用公钥/私钥对作为交付证明

标签 security rsa digital-signature private-key

问题

我正在开发一个移动应用程序,其中用户 A实际用户 B 交付某些内容,而用户 A 必须证明它已交付。

有一个限制:

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

我的方法

我考虑过使用密码学来解决这个问题:

安排交货后,会发生以下过​​程:

  1. 生成 key 对并将其存储在数据库中。
  2. 私钥属于用户 B,应转移到他的移动应用。
  3. 某些wellknown+delivery_uuid字符串使用公钥加密,并传输给用户A
  4. 用户 A 仅在交付时显示加密代码(以 QRCode 形式)。
  5. 用户 B 面向配送时使用移动应用读取 QRCode。
  6. 由于加密消息以众所周知字符串开头,因此用户 B 移动应用可以对其进行解密并验证该消息是否正常。如果有效,应用程序会存储 delivery_uuid 部分,并在用户访问互联网后立即发送到服务器端进行跟踪。
  7. 如果用户 B 尝试伪造 delivery_uuid,它显然不会匹配。
  8. 如果用户 A 尝试伪造 QRCode,用户 B 的应用将无法验证该消息。

担忧

  1. 每条加密消息中都存在众所周知的片段,这一事实会使其变得更弱吗?考虑到 key 对仅使用一次。
  2. 公钥不应对任何人可见。只有后端必须使用它来创建送达证明消息。显然同样适用于 delivery_uuid
  3. 糟糕的事情发生了。如果用户 B 移动应用在发送到后端之前因某种原因崩溃并丢失了 delivery_uuid,则用户 B 将需要依赖用户 A 诚实。
  4. 我的 key 必须有多坚固?考虑到该套餐的货币值(value)较低。在这种情况下,RSA 是更好的加密吗?

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

注意:我不确定 Stackoverflow 是否是询问此问题的正确 stackexchange 社区,如果偏离主题,请发表评论。但由于它有一定的逻辑性,我认为这是正确的地方。

最佳答案

好像有点复杂。为什么不呢

  1. UserB(以及安装该应用程序以接收送货的每个用户)都会获得一个公钥/私钥对。私钥仅由UserB持有;如果丢失,可以发行新的一对。同时,公钥是公开的,并且与UserB的身份一起存储在数据库中。

  2. 收到包裹后,用户 B 生成一个简单的文本文档,其中包含日期和时间、二维码、接收包裹的人的姓名或任何需要的信息。该文档还包含公钥。任何格式都可以。

  3. UserB 使用其私钥对文档进行签名,并将签名附加到文档末尾。现在您有了一份明文文档,详细说明了所发生的一切,并证明 UserB 同意。

  4. 用户 B 与用户 A 共享文档,和/或将其上传到任何需要的地方,例如:记录系统。 UserA和UserB都可以保留离线副本。

  5. 如果需要交付证明,用户A只需出示签名的文件即可。

关于security - 使用公钥/私钥对作为交付证明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49640987/

相关文章:

java - findbugs和数据库密码安全问题

javascript - 签名有效负载时出错(JWT、jsrsasign)

java - 使用椭圆曲线加密验证签名

php - 除了官方常见问题解答中列出的问题外,Windows 服务器上生产的 XAMPP 是否还有其他安全/性能问题?

sql-server - SQL Server 在 Windows 应用程序中返回错误 "Login failed for user ' NT AUTHORITY\ANONYMOUS LOGON'."

java - 使用 BC key 或默认 key 有什么区别?

javascript - phpseclib 不验证 window.subtlecrypto 中生成的签名

java - 如何在iText签名印章中添加自定义字段?

java - PDFBox - 打开并保存签名的 pdf 会使我的签名无效

.net - 在 web.config 中加密 appSettings