【问题标题】:End-to-End encryption for a chat application聊天应用程序的端到端加密
【发布时间】:2018-06-23 07:28:18
【问题描述】:

我正在尝试构建一个仅用于教育目的的 android 聊天应用程序。我想尝试实施端到端加密,以确保我的消息安全。我想过使用 RSA 作为加密方案(我是密码学领域的新手)

这就是我认为我应该这样做的方式,

第 1 步:在客户端和服务器端生成公钥和私钥。

第 2 步:交换公钥。 (这意味着服务器将拥有每个客户端的公钥)。

第 3 步: 使用服务器的公钥加密消息并发送到服务器,反之亦然。

第 4 步:然后服务器可以使用其私钥解密消息。

所以我的问题是,

  1. 如何存储私钥?
  2. 这种方法有什么缺点?
  3. 这实际上应该如何实现?

请帮我弄清楚这个概念

【问题讨论】:

  • 1.不要这样做,即使是一些最优秀的密码学家也会弄错。 2.如果必须使用e2e加密聊天,请查看Signal。 3. 保持服务器安全非常困难,安全方案使用 HSM,如果 Apple 在设置后销毁管理员密钥。 4. 要了解需要什么,请参阅iOS Security January 2018 iMessage,从第 51 页开始。
  • 我投票决定将此问题作为离题结束,因为这与其说是一个编程问题,不如说是一个加密设计和安全问题。也许是 crypto.se?
  • 我投票结束这个问题,因为它不是一个编程问题,而是一个密码学和安全问题。到目前为止给出的建议也很糟糕。

标签: encryption cryptography rsa


【解决方案1】:

你描述的是不是端到端加密。

端到端意味着两个端点(客户端)之间的通信是加密的。整个想法是服务器永远无法读取或修改对话数据。

我将主要回答你的最后一个问题,因为这可能是最相关的一个:

这实际上应该如何实现?

您要实现的目标是让对话伙伴共享相同的密钥。普遍接受的方法是使用(椭圆曲线)Diffie-Hellman key exchange。建立共享密钥后,我们可以使用合适的AEAD scheme 在客户端之间开始通信。

请注意,这仍然容易受到中间人攻击,因此我们需要一种带外方法来验证两个客户端实际上是否共享相同的密钥。这通常通过手动比较键的哈希值来完成 (example: Signal)。

所以基本上服务器只充当客户端的中继。无论如何,使用 TLS 连接服务器仍然是一个好主意。

请注意,我们没有考虑以下主题:

  • 前向保密(通过重新加密)
  • 重放攻击
  • 客户的匿名性
  • 冒充其他客户
  • 等等

最后,您真的希望实现一个经过彻底审查的协议,例如 OMEMOAxolotl,但我想这对于一个教育项目来说有点牵强。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多