知识卡片
IM密钥管理三种方式的权衡:固定密钥、一人一密钥、动态密钥
内容
IM系统在安全层需要对消息内容做加解密,密钥管理方式大致有三种,安全性和实现复杂度依次递增。固定密钥是最简单的方式,服务端和客户端约定同一个密钥和同一个加密算法,每次发送前用这套约定加密、接收后用同一套约定解密,实现最简单,但一旦这一个密钥泄露,所有用户的通信都会暴露,是最脆弱的方案。一人一密钥在固定密钥的基础上引入用户特有属性(如用户uid、手机号),让每个用户的密钥各不相同,即使某个用户的密钥泄露,影响范围也被限制在这一个用户身上,不会波及全体,安全性有明显提升但实现和管理成本也随之增加。动态密钥则是每次会话开始前都重新协商一次密钥——客户端先向服务端请求”这次通话用什么密钥”,服务端随机生成并下发,本次会话使用这个临时密钥通信,安全性理论上最高,但存在一个明显弱点:这次密钥协商的过程本身如果被攻击者截获,攻击者同样能拿到这个动态密钥,所以动态密钥方案通常还需要配合SSL这类机制去保护协商过程本身,而不能假设协商过程天然安全。这三种方式反映了安全设计里常见的一条规律:安全强度的提升往往伴随着”密钥泄露影响范围”的持续收窄——从影响全体用户,到影响单个用户,再到影响单次会话——但收窄影响范围的代价是密钥管理和协商机制的复杂度也在同步上升,选择哪一种取决于业务能承受的风险敞口和愿意投入的工程成本。
参考来源
- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.4 从零开始搭建高可用IM系统"节,"2.4.2 协议设计"(源文件:_epub-src/OEBPS/Text/Chapter2_4_3.xhtml)
- 结论依据:原文逐一介绍固定密钥、一人一密钥、动态密钥三种方式的实现方式和局限(动态密钥"一旦攻击者截取报文,就能知道你的动态密钥"),直接支撑本卡片的对比与规律总结。
- 原始内容:固定密钥。服务端和客户端约定好一个密钥……一人一密钥……在固定密钥的算法中包含用户的某一特殊属性……动态密钥……每次传输交互前协商密钥……但是一旦攻击者截取报文,就能知道你的动态密钥。