验证来自数据库的公钥

时间:2016-08-29 08:48:09

标签: security encryption cryptography chat

我写了一个小聊天应用程序,用户可以在其中写下彼此的消息:

  • 首次登录时,用户将生成从用户密码派生的公钥/私钥对。
  • 公钥将被发送到服务器(数据库)。
  • 如果用户(A)想要向用户(B)写入消息,则用户A用用户B的公钥加密该消息并将其发送到服务器(然后服务器将其发送给用户B)。

但是,如果有数据库访问的人会改变数据库中用户B的公钥呢?然后攻击者可以读取所有消息。

是否有可能以某种方式验证数据库中的公钥并确保它没有被更改并且它100%属于用户B?

1 个答案:

答案 0 :(得分:1)

因此,您正在尝试防范攻击者控制服务器且服务器无法信任的情况。由于您无法信任服务器的任何信息,因此您无法直接在任何形式的验证中使用它。服务器只能降级为愚蠢的传输,验证需要直接针对其他对等方进行。

能够在带外交换密钥在这里会有很多帮助,这意味着你可以以某种方式促进密钥的直接点对点交换。由于很难在一般互联网上信任随机远程对等体的身份,因此您需要采用Threema之类的策略:您可以匿名获取任何远程对等方的公钥,但您与该对等方的关系是然后没有验证。只有当您能够亲自见面并通过物理扫描彼此交换/验证密钥时,QR码才是值得信赖的关键。

为了通过不可靠的服务器促进与远程对等体的任何类型的密钥交换,您基本上需要实现Diffie-Hellman密钥交换;服务器可以促进通信,但是不能看到正在交换的数据。这必须发生在两个同时在线同时在线(或者来回的离线非常缓慢),因此在实践中可能会有些问题,具体取决于您的使用案例。