8520ccc
2022-05-03 16:12:58 +08:00
我的理解
现有的用户不自行保存私钥的情况下实现的端到端加密方式如下:
用户 A 用户 B 分别生成私钥+公钥
然后将 公钥发送到中心化的服务端
A B 之间通讯时需要先去查询获取对方的公钥
然后彼此的消息使用对方的公钥加密,对方使用私钥解密
当然了这样性能不够好,可以按时间生成对称加密密钥,两者仅需在一段时间内协商好对称密钥即可
此时会存在一个小问题,如果 A 或 B 用户完全退出登录 APP 清楚数据
重新登录后将失去查看历史记录消息的能力
因为私钥是不可以上传的服务器的
即仅可以在客户端可见
同时若多客户端同时登录一账户也会存在问题,新的设备没办法获取当前的私钥
当前服务商可以选择从旧设备上面加密获取
但是此操作可能会被服务商利用
比较好的处理方式就是,新设备登录时需要任意一个旧设备点击确认(点击确认就代表把旧设备的私钥以安全的方式传输给新设备)
这样可以实现多客户端同时登录
-----------------------------------------------------------
回归原题,检测是否为端到端加密,那就是审核客户端代码了,只要客户端的代码中没有将客户端生成的公钥上传的服务端那就没问题!或者说即使有上传私钥的情况也是必须经过用户确认授权然后加密传输到新设备的!
PS:事实上这种确认授权的方式依旧可能被服务商利用,然后获取你本地的私钥,即使需要用户确认(因为服务商可以返回一个伪装的新的客户端的公钥)
除非旧设备直接扫码获得新设备的公钥,然后直接上传服务商传输
那么此时的私钥传输是安全的
---------------------------------------------------------------
事实上对于普通用户,想要完全验证几乎不可能的!!!
因为即使客户端代码开源,但是上架到 app store ,google play 以及其他平台的客户端编译后的软件你没办法确认是否携带了私货
此时大概能有以下几种方案进行解决
一,抓包验证,客户端的所有请求都是可以被抓包后解密出原文的,可以通过此 APP 的全部网络通讯来确定不存在上传额外的信息
二,自行编译源码
--------------------------------------------------------------
其实也有另外的实现方式,那就是用户自行保存私钥的模式
这就是目前 web3 社交 /聊天项目的实现了