LOKI开发日记:创建去中心化的好友请求系统

《财富代码》-深度分析、挖掘区块链价值项目,https://www.first.vip/hodl

Session的设计首先要考虑到隐私-分散的服务器,没有电话号码,全部-但这会带来一些问题。就像,您如何让用户交换加密密钥并尽可能快速,平稳地建立聊天“会话”(眨眼,眨眼)? 

Session最初是Signal的一个分支,但我们想改善Signal的一些固有漏洞。当您使用Signal或Whatsapp时,您的电话号码将用于识别您的身份。当您的朋友向您发送消息时,您就会知道它确实是 

当您在Signal上注册您的电话号码时,您会将几个预密钥捆绑包上传到Signal的服务器。一旦有人将您添加为朋友,服务器就可以分发您的密钥-即使您处于脱机状态。然后,添加您的人可以立即建立加密的聊天“会话”。使用电话号码和中央服务器使交换加密密钥(和通信)变得超级容易,但是却损害了用户的隐私。例如,您的电话号码很容易被黑客入侵,SIM卡交换,或者您的提供商很容易将您的电话号码重新分配给其他人或帐户。 

我们不想做出让步-用户隐私是我们的核心使命。 

当用户收到好友请求时,诸如Signal和Whatsapp之类的集中式消息传递应用程序会收集,存储和分发密钥,而Session使用分散式服务器-因此我们需要找到一种异步执行此操作的方法。

任务:设计一个不使用电话号码的“朋友请求”系统,以便在异步网络中建立信号协议会话。 

Signal的朋友请求系统使用一种称为Diffie-Hellman密钥交换协议的协议,Session的协议也是如此,但是我们必须进行一些修改。  

Diffie-Hellman协议允许您生成共享机密。该共享机密是通过一系列级联的密钥创建的-散布了您的密钥,一些接收伙伴的密钥,以及最后一次达成协议的公用密钥。 

查看此图以更好地理解它:

  1. 爱丽丝有秘密钥匙A,鲍勃有秘密钥匙B。
  2. 爱丽丝和鲍伯都同意使用公钥C。
  3. 爱丽丝混合A和C(AC),而鲍勃混合B和C(BC)。 
  4. 他们彼此分享这些结果。
  5. 然后,爱丽丝(Alice)将A与BC(ABC)混合,而鲍勃(Bob)将B与AC(ABC)混合,因此它们都达到了最终密钥。

注意:任何收听通信的人都可以看到C,AC和BC,但不能单独看到A或B –他们无法获得最终密钥ABC。

基本上,Diffie-Hellman允许您一起创建新的密钥。这种加密方法使Alice和Bob可以轻松解密和读取其消息,而不会受到其他人的监视。

Signal使用一种称为扩展三重Diffie-Hellman的协议,在该协议中,这些Diffie-Hellman共享秘密的序列会生成并捆绑在一起-称为“密钥前捆绑”。对话中的人们可以使用这些预密钥束相互进行身份验证。  

使用Signal时,将生成大量的这些预密钥捆绑包并将它们存储在Signal服务器上。这样,如果有人想尝试向您发送消息,他们可以立即发起会话,因为Signal可以提供预密钥捆绑包。 

但是,由于Session是分散式的,因此它没有用于这种存储的服务器,这很难解决。基本上,这意味着发送者在响应之前无法知道接收者已经收到了他们的消息。建立会话需要某些加密原语,因此您需要确定双方都拥有正确的密钥(并且密钥足够!),否则它们将无法读取彼此的消息。 

在Session中发送朋友请求时,您不仅在发送一个Diffie-Hellman密钥,而且还在发送四个。使用临时密钥(这是一次性使用的公共密钥,旨在在使用后将其删除),您可以制作预密钥,以使您可以在会话开始后继续发送消息。 

然后使用密钥派生函数将这4个密钥捆绑在一起,伪造一个密钥以统治所有密钥。 

最后,您可以将这个单一的预密钥捆绑包(用于统治所有捆绑包的捆绑包)作为好友请求发送。 

在各方都同意会话已经开始并且还同意其参数之前,需要发送一些其他消息。为了更好地理解这一点,让我们回到爱丽丝和鲍勃:

  1. 爱丽丝会生成一个预密钥束,并将其作为好友请求发送给鲍勃 
  2. 鲍勃生成自己的密钥前束,并将其与爱丽丝的束混在一起,从而在鲍勃端开始会话。 
  3. 然后,Bob将空消息发回给Alice,并在后台附加了他的密钥前捆绑包。注意:公钥正在此步骤中发送,但仍处于加密状态。
  4. 爱丽丝会收到鲍勃的钥匙,并将其与她早先寄给他的钥匙混合在一起,从而在爱丽丝的末端开始会话。注意:如果 Alice可以解密Bob的空消息,则知道该会话是有效的。
  5. 爱丽丝通过将空消息发送回已加密为标准协议消息的鲍勃来确认会话已建立。 
  6. Bob收到此消息后,便知道会话已建立。

我们需要解决的复杂问题包括对两端的交换状态进行建模,并能够平稳地恢复丢失的消息,而无需牺牲UX。

将此与Signal的协议进行对比。当您的朋友请求某人时,他们已经准备了一堆预密钥捆绑包,这些捆绑包存储在Signal的服务器上。因此,您无需直接与新朋友联系-只需与Signal的服务器通信即可。 

会议没有这种奢侈。它的分散式设计意味着您无法准备好一堆预密钥捆绑包-在创建聊天会话时必须创建它们并点对点发送。

这并不容易。在几个月的时间里,我们回到了3至4次这个问题,并且花了一些迭代。我们认为我们已经找到了解决方案,然后一个月后,我们发现了一个“边缘案例”,需要不断修改。 

听起来很累,但事实是,我们的解决方案变得越来越难解决-它们变得越来越好。

 

本文由 区块链资讯平台头等仓 作者:Loki Network(洛基网络) 发表,其版权均为 区块链资讯平台头等仓 所有,文章内容系作者个人观点,不代表 区块链资讯平台头等仓 对观点赞同或支持。如需转载,请注明文章来源。
《财富代码》-深度分析、挖掘区块链价值项目,https://www.first.vip/hodl

发表评论