V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
XiLingHost
V2EX  ›  问与答

群聊的端到端加密有什么实现方案?

  •  
  •   XiLingHost · 2022-01-26 11:09:44 +08:00 · 4234 次点击
    这是一个创建于 1024 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚才在 /t/830661 中聊到了端到端加密,现在的端到端加密似乎比较好实现的都是一对一的私聊
    而群聊的端到端加密似乎最常见的实现都是要么牺牲安全性用共享密钥,要么牺牲性能把群聊转换为一系列单聊对每条消息分别使用每个成员的公钥进行加密
    有任何其它的方案吗?
    14 条回复    2022-01-27 13:02:05 +08:00
    summic
        1
    summic  
       2022-01-26 11:27:18 +08:00
    Wire 群聊的实现是牺牲效率,保障安全性。缺点是群人数限制,超过两百人就很难用了
    https://github.com/wireapp/proteus
    delpo
        2
    delpo  
       2022-01-26 12:50:29 +08:00 via Android
    ‘‘牺牲安全性共用密钥’’
    个人不觉得共用密钥牺牲了安全性,身为群聊的一个成员知道群聊的密钥不是很正常的吗
    maichael
        3
    maichael  
       2022-01-26 13:17:13 +08:00
    @delpo #2 “牺牲安全性”应该指的是一旦有一个人泄露密钥了,这个群的所有聊天都“不安全”了。
    dingwen07
        4
    dingwen07  
       2022-01-26 13:30:30 +08:00
    最安全的就是每条消息都对每个参与者加密,参与者数量上升后理论上性能会变得低下。
    也可以在每次有成员变动后,都重新用非对称加密方式交换群组共享的对称式密钥。
    也不知道之前宣称安全的 Signal 、Tok 怎么做到上百人端对端加密群组的。
    Rocketer
        5
    Rocketer  
       2022-01-26 13:33:53 +08:00 via iPhone
    群聊不就是共享内容吗?一个人泄露密钥,就像一个人给其他人看群聊内容一样,不就应该全看见吗?
    delpo
        6
    delpo  
       2022-01-26 13:58:44 +08:00
    @maichael 你的问题我感觉是矛盾的

    比如说我们实现了这样的一个系统,使得某个人 A 的密钥泄露了以后,其他人之间的会话还是安全的。攻击者有了 A 泄露的密钥,因为 A 是群聊的一员,无论系统加密的方法是什么样,所以 A 可以获取所有消息,那么攻击者也可以获取群聊的所有信息。很明显没有办法实现你所谓的“安全”
    XiLingHost
        7
    XiLingHost  
    OP
       2022-01-26 14:19:20 +08:00
    @delpo 那这就导致了一个问题,你实际上无法简单地把人移除出群聊,因为你除了维护参与人列表之外你还必须负责密钥的轮替,而密钥轮替和再分发的方式就很成问题
    XiLingHost
        8
    XiLingHost  
    OP
       2022-01-26 14:20:36 +08:00
    而如果是通过对每个通信单独加密就不需要处理公用密钥对的轮替和再分发问题,只需要简单地添加和删除公钥和对应的用户列表就可以处理参与者的增减
    XiLingHost
        9
    XiLingHost  
    OP
       2022-01-26 14:21:54 +08:00
    @maichael 不止是这个问题,还有密钥对的分发和再分发问题,只要整个过程需要传输私钥就是不安全的,理想状态是整个过程都只有公钥和已加密的数据在传输,而私钥始终在本地
    maichael
        10
    maichael  
       2022-01-26 14:23:26 +08:00   ❤️ 1
    delpo
        11
    delpo  
       2022-01-26 14:42:16 +08:00
    @XiLingHost 其实现有的 IM 都有现成的解决方案,比如说 signal 的:
    https://signal.org/blog/private-groups/
    这是 signal 的群聊实现,用户 A 发送的每条消息都使用一个临时生成的对称密钥 K 加密,而密钥 K 通过一对一的 e2ee 会话发送给每一个群聊人员,而加密后的消息只需要发一份给服务器,服务器负责转发给每个人,这样就可以节约流量。如果收到了某个人 B 退出或者被踢出群聊的信息,以后只要不把临时密钥 K 发送给 B ,就可以保证后续消息 B 无法解密。
    至于这个博客中说的最后一种模型,实际上视频会议中用得比较多,比如说 jitsi 就是自动轮转,每当一个人退出会议后所有人自行派生出新密钥并用其进行加密通信
    duke807
        12
    duke807  
       2022-01-26 18:35:48 +08:00
    我覺得無論是 私聊 還是 羣聊,都應該使用 RSA 類型的對方的 pub key 加密分發 AES 類型的對稱密碼,然後用 AES 加密數據內容,因爲大數據用對稱加密效率高。

    任何一個管理員(私聊的話,雙方都是管理員),都可以主動更新 AES key ,用各成員的 RSA pub key 加密分發。
    AES key 可以定時(或者根據聊天條數)更新,除非所有管理員都不在線才延遲更新。

    至於安全性,羣聊本來就必然存在風險,譬如某個成員的 RSA private key 不小心泄漏,或者該成員故意截圖外發。
    使用上述 AES 加密並不會增加風險。

    額外要提的是,端到端加密只對開源軟件有意義,商業軟件再怎麼聲稱端到端加密,只要客戶端不是開源,就沒有意義。
    duke807
        13
    duke807  
       2022-01-26 19:05:05 +08:00
    我上面提的 AES key 是所有成員共用的

    AES key 的更新時機還要補充一下,增減成員的時候

    再提一下,不支持聯邦式的 IM 通訊都是垃圾
    LxExExl
        14
    LxExExl  
       2022-01-27 13:02:05 +08:00
    @maichael #3

    “一旦有一个人泄露密钥了,这个群的所有聊天都“不安全”了。”

    那么同理,私聊 1 对 1 的时候,如果这个人泄露密钥了,那么这个人的所有聊天就都“不安全了”。


    再抬杠一下,如果一个人把自己的银行卡密码泄露了,那么这个人的银行卡里的钱就不安全了。


    这看着没什么问题鸭
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1145 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 18:52 · PVG 02:52 · LAX 10:52 · JFK 13:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.