Nymo:一个匿名分布式的消息网络

2022-04-13 03:00:26 +08:00
 SuperFashi

过去一年在写一个匿名分布式的消息网络,取名叫 Nymo ( annonymous 中间的字母,读作 nemo )。

在这个网络中每个用户会持有一组非对称式密钥对,公钥用来做身份识别和消息加密,私钥用来做签名和消息解密。生成消息和加入网络需要工作量证明,以避免拒绝服务和中间人攻击。消息通信是每个节点尽力交付,目前用的是类似疫情传播的算法。每个用户会被随机分入不同的群组内,以做到 k-匿名性和有效率的消息传递。

协议还定义了节点交换、消息格式、本地节点发现协议和中继节点。协议会隐藏在常用应用层协议之下(如 HTTPS )以规避审查,在验证通过之后才会开始真正的 Nymo 网络通讯协议。

白皮书还在写,但是已经用 Go 写了一个实现,顺便还内置了 UPnP NAT 穿越。还写了一个 Web UI ,所以可以直接拿来用。希望有兴趣的朋友可以试一试,看看能不能找到安全方面的问题。

Nymo Core: https://github.com/nymo-net/nymo

Nymo WebUI: https://github.com/nymo-net/nymo-webui

4680 次点击
所在节点    分享创造
44 条回复
nielinjie
2022-04-13 14:21:21 +08:00
为啥有人要看匿名发布的消息?
lzcers
2022-04-13 14:37:50 +08:00
厉害!我之前也想用 Rust 基于 libp2p 写一个,没想楼主竟然已经做到了!
777777
2022-04-13 14:40:58 +08:00
感觉有很多类似的项目,楼主此项目的优势是什么呢?😀
SuperFashi
2022-04-13 15:05:27 +08:00
@lookStupiToForce 我表述不够详细。加入随机群组是指的用户会被分配到一个虚拟的组内 /给一个不唯一的编号,没有方法可以区分任何两个在同一组内的用户,以达成匿名性。消息是通过 p2p 的广播( gossip ),网络通信部分是可能被垃圾信息占用资源,但是如上面所说有 pow 和日后可以通过别的方式改善(比如上下行对等的策略)。
SuperFashi
2022-04-13 15:10:10 +08:00
@nielinjie 这个不是匿名的布告栏,是保证匿名性的分布式消息传递网络。
lookStupiToForce
2022-04-13 15:25:27 +08:00
@SuperFashi #24 感谢解答。这样从结果来看,就是将用户身份识别从单点放到了群组上?其他收到消息的用户只知道是这个组发出的,没法溯源是这个组下哪个用户嘛? Group 2 Peer XD ?咦,那这个接收消息的 Peer 想反向发消息,怎么发给原来的人呢,还是说加密只在群组外进行,群组内还是可以互相识别?(原谅我密码学小白,不知道这种不对等加密解决方式)
SuperFashi
2022-04-13 15:46:17 +08:00
@lookStupiToForce 类似于 ECIES:发送的时候发送者把自己的公钥也嵌在消息里面一起加密,然后给消息用私钥签个名。消息的收件地址是收件人所在的组。消息传到这个组内的时候所以组内成员都会尝试解密,能够成功解密的就是收件人。收件人解密完后用消息内部的公钥就可以知道谁是发件人,并且通过公钥和签名可以验证消息的确是这个发件人发的。
lookStupiToForce
2022-04-13 15:55:34 +08:00
@SuperFashi #27 看完仍不得要领,不得不再次感慨密码学的牛逼😂我得补补课
smallyu
2022-04-13 16:55:08 +08:00
工作量证明生成消息,效率不会很低吗
est
2022-04-13 17:50:02 +08:00
whitepaper.md 不存在。
sewer
2022-04-13 19:12:03 +08:00
@777777 优势就是你写不出来 smile
SuperFashi
2022-04-13 22:14:00 +08:00
@smallyu 什么样的效率会低?
120267583
2022-04-14 00:28:12 +08:00
解决广告滥用,我提供一个思路
1 、引入代币、前期 POW 挖矿、后期质押挖矿
2 、发帖消耗代币、并且消耗的代币空投给所有质押挖矿者
3 、消息查看可以按照质押代币数量显示、质押的代币越多、质押的时间越长、可信度越高
4 、加入黑名单机制、如果有一个账号持币量很大进行滥用、用户可以进行主动拉黑操作

感觉以上几个思路可以很好的起到广告滥用的情况,同时又保证了匿名信
SuperFashi
2022-04-14 00:55:22 +08:00
@120267583 似乎你又发明了一个分布式账本(区块链)
LeeReamond
2022-04-14 04:11:22 +08:00
很好奇 LZ 如何解决工作量证明抖动的问题,比如寻找某 hash 前 n 位为 0 作为工作量证明的话,位数太少,很快就找到了,没有意义,位数每多 1 位,工作时间增加若干倍,再加上搜索时间本身有抖动,最低值可以很低,最高值又变得非常大,那么实际发消息的体验是否是发出一条消息,等 1 分钟后才提示发送成功,然后再等一分钟对方才会回一句话
SuperFashi
2022-04-14 05:57:00 +08:00
@LeeReamond 有期望值,方差也不是很大,目前设定的参数在现代电脑上 1-5s 之间。实际上可以考虑成邮件形式,虽然 webui 做成了及时聊天的样子(可能是个错误)
LeeReamond
2022-04-14 13:27:51 +08:00
@SuperFashi 很喜欢你的匿名消息网络想法,但感觉有些问题,为了保证程序兼容性一般是使用 cpu 计算,但这份工作量证明对于显卡计算来说又显得微不足道,对于 2022 年这种即使是个人用户也可以掌握充分算力的情况,系统的防洪机制显得很脆弱。另外我很好奇你的工作量证明实现如何保证 1-5 秒计算,起码我个人测试当中以 sha256 算 0 来看单次计算超过均值百倍情况也有出现,这意味着普通用户如果需要 5 秒发出,偶尔有的人会需要 5 分钟才能发出。另外 5 秒的工作量感觉即使是作为 cpu 计算也显得少了,但同时你很难控制比如想要将 5 秒增加到 10 秒。
SuperFashi
2022-04-14 13:51:59 +08:00
@LeeReamond 嗯有道理,做参照的话 BitMessage 他们选了 SHA512 所以比特币的 ASIC 不能拿来直接做 PoW 。他们的 PoW 难度也大,期望值大概是 5 、6 分钟左右(他们是邮件的形式)。所以感觉是可以在 peer 交换之间再设一条坎,比如上下行对等、频率限制等。
ufan0
2022-04-14 16:16:32 +08:00
@sewer #31 你这个是讽刺楼上的意思吗?

楼上的提问对于个人开发者来说是不错并且值得回应的问题。
liuser666
2022-04-14 17:22:21 +08:00
我擦,我就是想弄这种东西,但是原理性的东西和具体的 api 都不熟悉,先看看大佬的代码借鉴一下!!!如果好的话直接当 contributor !!!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/846643

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX