电报完美前向保密
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只能用于以下方法:
- auth.bindTempAuthKey
- help.getConfig
- help.getNearestDc
为了将临时授权密钥绑定到永久密钥,客户端会创建一个特殊的绑定消息,并使用`temp_auth_key`执行 `auth.bindTempAuthKey`方法。`auth.bindTempAuthKey`执行成功后,客户端即可像往常一样继续使用 API;每次绑定后,客户端还必须使用`initConnection`重写客户端信息。每个永久密钥一次只能绑定到一个临时密钥,绑定新的临时密钥会覆盖之前的密钥。
auth.bindTempAuthKey请求也可能返回ENCRYPTED_MESSAGE_INVALID错误,必须按如下方式处理:
-
仅当请求中使用的永久身份验证密钥是在 60 秒前创建的:
-
删除临时和永久身份验证密钥。
如果删除的主身份验证密钥是主登录身份验证密钥(用于登录用户本地域控制器的密钥),则表示该用户也已注销。 - 重新创建临时和永久身份验证密钥。
- 请重试绑定临时密钥和永久密钥。
- 成功后,如果丢弃的身份验证密钥不是主登录身份验证密钥,则从用户的本地 DC 重新导入授权。
-
删除临时和永久身份验证密钥。
- 否则,请重试绑定临时键和永久键。
临时密钥过期后,客户端需要使用p_q_inner_data_temp生成一个新的临时密钥。然后,它需要将这个新的临时密钥重新绑定到初始的永久密钥。也可以预先生成一个新密钥,这样在旧密钥过期时,客户端就已经拥有一个可用的新密钥了。
为了提高安全性,客户端可以将临时授权密钥仅存储在 RAM 中,而不要将其保存到持久存储中。
临时授权密钥可能在expires_at之前的任何时刻过期,因为此类密钥也仅存储在服务器端的 RAM 中。请准备好正确处理由此产生的 MTProto 错误(不存在的 auth_key_id 将导致 404 错误)。