电报完美前向保密

Telegram 支持完美前向保密(PFS)。

为了实现这一点,客户端使用p_q_inner_data生成一个永久授权密钥,并使用p_q_inner_data_temp生成一个临时密钥。(更多信息请参阅“创建授权密钥”。)这两个操作可以使用不同的连接并行执行。客户端必须保存expires_atUnix 时间戳expires_at = time + expires_in。

重要提示:为了实现 PFS,客户端绝不能直接使用永久 auth_key_id。发送到 MTProto 的每条消息都必须使用绑定到永久 auth_key_id 的临时auth_key_id进行加密。

未绑定的temp_auth_key_id只能用于以下方法:

为了将临时授权密钥绑定到永久密钥,客户端会创建一个特殊的绑定消息,并使用`temp_auth_key`执行 `auth.bindTempAuthKey`方法。`auth.bindTempAuthKey`执行成功后,客户端即可像往常一样继续使用 API;每次绑定后,客户端还必须使用`initConnection`重写客户端信息。每个永久密钥一次只能绑定到一个临时密钥,绑定新的临时密钥会覆盖之前的密钥。

auth.bindTempAuthKey请求也可能返回ENCRYPTED_MESSAGE_INVALID错误,必须按如下方式处理:

临时密钥过期后,客户端需要使用p_q_inner_data_temp生成一个新的临时密钥。然后,它需要将这个新的临时密钥重新绑定到初始的永久密钥。也可以预先生成一个新密钥,这样在旧密钥过期时,客户端就已经拥有一个可用的新密钥了。

为了提高安全性,客户端可以将临时授权密钥仅存储在 RAM 中,而不要将其保存到持久存储中。

临时授权密钥可能在expires_at之前的任何时刻过期,因为此类密钥也仅存储在服务器端的 RAM 中。请准备好正确处理由此产生的 MTProto 错误(不存在的 auth_key_id 将导致 404 错误)。