Nkn消息传递中的一个比较致命的缺点

NKN网络对网络元数据的保护目前比较不足,尽管消息是端到端加密的。但是对发送者和接受者的匿名性的保护确实不太到位。假设alice发送一个消息给bob,这消息一旦发送出去,那么链路中途经的任何一个节点都会知道这个消息是alice发送给bob的,即alice在给bob发消息。希望下一步NKN网络可以借鉴waku v2的一些好做法来提高对元数据的保护。

发送路径确实不是隐藏的。这么设计的原因是,为了防止一些中转节点作弊的可能性,签名链中路径必须是在共识阶段公开可验证的。这里的验证包括了消息发送和接收方的签名验证,他们的公钥是否在签名链中构成一个完整的路径,以及这个路径是否符合网络的路由规则等等。目前还做不到在兼顾签名链的可验证特性的情况下隐藏消息发送和接受方的公钥。不过这确实是一个很好的研究方向。

对发送方地址的保护感觉可以进行如下改进,即节点在发送客户端传送的消息的时候,签名链的发送方不写client的真实地址而是用接受方的公钥进行加密后的字符串,这样消息依然可以到达接收方,不会影响具体功能,同时在全网也保护了发送方。
对接受方地址的保存需要改的多一些:
1.发送方alice给接收方bob对应的节点发送握手,表示要和接收方bob通信。节点对bob地址进行验证确认,确认成功后返回一个随机字符串给alice。节点自己记录随机字符串和alice的对应关系。
2.随后的签名链中,接受方的地址是用接受方的公钥对(接收方的地址+随机字符串)进行加密后的对应字符串。
3.节点内部维护多个队列,队列的标识就是加密后的接收方字符串(加密后的接收方的地址+随机字符串)
4.client登录后遍历队列,并用自己的私钥对这些字符串进行解密,一旦发现自己的公钥出现,便将特殊字符串给节点。
5.节点验证核对无误后,将消息传递给client。
当然这个特殊字符串肯定要设置超时时间,比如可以设置成1小时,一小时后再重新申请。

这里的问题是,公钥不仅仅是用作加密,同时也是用作路由的地址。如果不用对面的公钥,消息是无法送达的。这里的本质问题是,任何网络中都需要一个路由地址来接收消息(比如传统的 IP 地址,NKN 里面是公钥),攻击者会想办法用路由地址来获取身份信息。

但是这个问题也不是没有解决办法,而且甚至都不需要底层的改动,应用层就可以自行完成。比如双方可以每隔 X 条消息就协商并切换所使用的路由地址,由于这个协商过程是端到端加密的,其他人不知道双方的下一个地址对是什么,并且路由地址也都是不复用的,所以是不会被和身份关联起来的。