真正的点对点聊天通讯隐私实现想法

2021-07-28 14:51:06 +08:00
 brader

实现想法:

A 发送消息给 B

检测是否持有 B 的公钥  

    若有,使用 B 的公钥对消息进行 RSA 加密并发送。  
    若无,则先请求 B 传输公钥过来,B 生成公私钥并缓存在本地。  

B 收到消息后,使用自己的私钥进行消息解密。  

B 发送消息给 A
同理

我想,这样应该才是能实现真正隐私通讯的,连服务提供方都无法窃取消息的,而不是市面上一些聊天软件慌称的“隐私”。

这种通讯隐私方案可实现吗?会有软件愿意为了用户隐私而实现吗?

13439 次点击
所在节点    程序员
125 条回复
blackshow
2021-07-29 14:22:26 +08:00
jim9606
2021-07-29 15:35:18 +08:00
你这个已经是大幅简化的模型,E2E 聊天软件通常是使用 A 和 B 的 RSA/ECC 密钥对通过密钥交换算法(例如 DHE/ECDHE )获得双方共享的 Session Key (对称密钥),用这个进行消息加解密。

问题在于虽然 Session Key 建立后服务器无法窃取信息,但它可以干涉公钥传递,A 不能保证拿到的公钥是 B 的公钥还是 C 的公钥。
Huelse
2021-07-29 16:21:00 +08:00
@jim9606 所以要有数字签名
liuidetmks
2021-07-29 17:31:12 +08:00
@lonnyzhang 交换 m 和 n 过程中,服务器被黑客攻击了,服务器自己生成 m1 n1 ,替换发给对 A,B,一人分饰两角, 后面所有的消息都能被服务器拦截并转发。
当然,AB 也可在建立信道之后,给对方发一次自己的随机数,这样就知道是否被攻击,可相应的黑客也能篡改消息内容,更进一步的欺骗。
rpman
2021-07-29 17:58:03 +08:00
我一直认为计算机是民科最泛滥的行业
rrfeng
2021-07-29 18:07:48 +08:00
好家伙,100 多层楼里一半多想法安全的都跟筛子一样……
lonnyzhang
2021-07-29 18:22:15 +08:00
@liuidetmks 再仔细看看,key 只在 AB 端生成,不会经过网络传输,包括服务器都是不可能知道的。所以即使服务器自己就是“黑客”,它也不可能知道 AB 两端用 key 对称加密后传输的是什么内容。
maybedk
2021-07-29 18:48:18 +08:00
@liuidetmks 哈哈,抓包软件都是这么抓 https 的
0576coder
2021-07-29 19:42:27 +08:00
@agee
如果端到端的代码还是被看到的话 ecdh 也没用 也能伪造中间人攻击 或者被中间人猜出了算法 也有可能是中间人攻击
jimmyismagic
2021-07-29 19:58:52 +08:00
telegram, keybase 了解一下
LnTrx
2021-07-29 20:05:25 +08:00
@rpman 但也是最好拆穿民科的行业,因为往往可以用构造性证明( show me the code )
Meano
2021-07-29 23:09:01 +08:00
楼里的人都不在一个层次啊,楼主还在想怎么用 RSA 做(密钥?数据?)交换呢,有些朋友已经在讨论公钥可靠性了。

加密通信的风险除了监听风险外,主要还是密钥协商时的公钥风险( CA 劫持,公钥伪造等),也没人提 IBE 啊,相比 DHE/ECDHE,IBE 用 User ID (公开,比如邮箱,相当于见字如面,不易伪造)+ 随机数(私钥)生成用户协商公钥,用户可以互相通过主公钥和 User ID 验证协商公钥是否来自于对方,相当于签名,可能的风险就看算法有没有后门了,主公钥如果受到干扰协商也不会成功。

@jim9606 这样应该没法做公钥干涉吧

倒是计算开销比较大,目前看到的 IBE 算法都是用双线性对,前段时间搞过 SM9 通用 CPU 计算,不用 Native code 耗时到秒级了
lonnyzhang
2021-07-29 23:35:46 +08:00
@liuidetmks 真正的端到端加密只会在端生成密钥,是不会经过网络传输的,服务端也破解不了传输的内容。
anonymous256
2021-07-30 00:57:05 +08:00
keybase,信息完全密钥加密
LeslieLeung
2021-07-30 01:33:16 +08:00
跟楼主有一样的想法 所以我做了一个这个 目前只开源了客户端 服务端暂时没时间上传
其实这个方案考虑不完全 不能防范中间人攻击 但是加上证书和签名就可以了
https://github.com/LeslieLeung/silbo
clearc
2021-07-30 06:43:29 +08:00
看内容和讨论,有一种十来年前复古的味道了
godblessumilk
2021-07-30 09:15:24 +08:00
zl939144892
2021-07-30 09:27:02 +08:00
量子纠缠 手动狗头
liuidetmks
2021-07-30 09:43:53 +08:00
liuidetmks
2021-07-30 09:44:42 +08:00
@lonnyzhang
你的意思我了解,可能是我没说清楚,你没了解我说的意思

服务器生成 (x,y)时候,同时自己模拟两个客户端 A1(用于和 B 通信,并生成 m1= x^r3 %y ) B1 (用于和 A 通信,并生成 m2 = x^r4 %y ),r3 ,r4 随机

AB 在交换中间 m 和 n 的时候,肯定会通过服务器,服务器这时候 收到的 m 和 n 截流,把 n1 发送给 A,把 m1 发送给 A 。
A 得到的密钥 m^n1 = n1 ^ m = x^(n1*m) % y
B 得到的密钥 n^m1 = m1 ^ n = x^(n*m1) % y

这样 A 和 B 不知情的情况下,分别和服务器建立了点对点加密通信,这样,服务器就完成中间人攻击了。

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

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

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

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

© 2021 V2EX