我们注册tg过程中,会需要使用到最新的上网参数,上网参数分为IP、端口、密钥。格式如下:
78.168.25.125
885
zlldaf522655pijj876h3423pij433326da4ddcd
如果需要获取最新的telegram参数,点击进入:http://redoufu.com/sites/445139.html
MTProto 移动协议
请随时查看我们的技术倾向常见问题解答。客户端开发人员必须遵守安全准则。
相关文章
-
移动协议:详细说明
-
创建授权密钥
-
创建授权密钥:示例
-
移动协议:服务消息
-
移动协议:有关消息的服务消息
-
二进制数据序列化
-
语言
-
MTProto TL-schema
-
端到端加密,秘密聊天
-
端到端 TL 架构
-
客户端软件开发人员的安全指南
编辑搜图
本页介绍用于云聊天的 MTProto 加密的基本层(服务器-客户端加密)。另请参阅:
-
秘密聊天,端到端加密
-
端到端加密语音通话
一般说明
该协议旨在从移动设备上运行的应用程序访问服务器 API。必须强调的是,Web浏览器不是这样的应用程序。
该协议细分为三个几乎独立的组件:
-
高级组件(API 查询语言):定义将 API 查询和响应转换为二进制消息的方法。
-
加密(授权)层:定义在通过传输协议传输消息之前对其进行加密的方法。
-
传输组件:定义客户端和服务器通过其他一些现有网络协议(如 HTTP、HTTPS、WS(纯 websockets)、WSS(基于 HTTPS 的 websockets)、TCP、UDP)传输消息的方法。
从 4.6 版开始,主要的 Telegram 客户端使用的是本文中介绍的 MTProto 2.0。MTProto v1.0(此处描述以供参考)已弃用,目前正在逐步淘汰。
组件摘要
高级组件(RPC 查询语言/API)
从高级组件的角度来看,客户端和服务器在会话中交换消息。会话附加到客户端设备(更确切地说是应用程序),而不是特定的 websocket/http/https/tcp 连接。此外,每个会话都附加到一个用户密钥 ID,通过该 ID 实际完成授权。
与服务器的多个连接可能处于打开状态。消息可以通过任何连接向任一方向发送(对查询的响应不一定通过承载原始查询的同一连接返回,尽管大多数情况下都是这种情况;但是,在任何情况下都不能通过属于不同会话的连接返回消息)。使用 UDP 协议时,响应可能由与查询发送到的 IP 地址不同的 IP 地址返回。
有几种类型的消息:
-
RPC 调用(客户端到服务器):对 API 方法的调用
-
RPC 响应(服务器到客户端):RPC 调用的结果
-
收到消息的确认(或者更确切地说,是一组消息的状态通知)
-
消息状态查询
-
多部分消息或容器(包含多条消息的容器;例如,需要通过 HTTP 连接一次发送多个 RPC 调用;容器也可能支持 gzip)。
从较低级别协议的角度来看,消息是沿 4 或 16 字节边界对齐的二进制数据流。消息中的前几个字段是固定的,由加密/授权系统使用。
每条消息,无论是单个消息还是在容器内,都由消息标识符(64 位,见下文)、会话内的消息序列号(32 位)、长度(消息正文的长度(以字节为单位;32 位)和正文(任何大小,即 4 个字节的倍数)组成。此外,当发送容器或单个消息时,会在顶部添加内部标头(见下文),然后对整个消息进行加密,并在消息顶部放置外部标头(64 位密钥标识符和 128 位消息密钥)。
消息正文通常由 32 位消息类型后跟与类型相关的参数组成。特别是,每个 RPC 函数都有相应的消息类型。有关更多详细信息,请参阅移动协议:服务消息的二进制数据序列化。
所有数字都写为小端序。但是,RSA和DH中使用的非常大的数字(2048位)是用大字节序格式编写的,因为OpenSSL库就是这样做的。
编辑搜图
授权和加密
在使用传输协议通过网络传输消息(或多部分消息)之前,它以某种方式进行加密,并在消息的顶部添加一个外部标头,该标头是:64 位密钥标识符(唯一标识服务器和用户的授权密钥)和 128 位消息密钥.用户密钥与消息密钥一起定义了一个实际的 256 位密钥,该密钥使用 AES-256 加密对消息进行加密。请注意,要加密的消息的初始部分包含变量数据(会话、消息 ID、序列号、服务器盐),这些数据显然会影响消息密钥(以及 AES 密钥和 iv)。消息密钥定义为消息正文的 SHA256 的 128 个中间位(包括会话、消息 ID 等),包括填充字节,前面是取自授权密钥的 32 个字节。多部分消息被加密为单个消息。
有关技术规范,请参阅移动协议:详细说明
客户端应用程序必须做的第一件事是创建一个授权密钥,该密钥通常在首次运行时生成,并且几乎从不更改。
该协议的主要缺点是,入侵者被动拦截消息,然后以某种方式盗用授权密钥(例如,通过窃取设备)将能够在事后解密所有拦截的消息。这可能不是一个太大的问题(通过窃取设备,还可以访问设备上缓存的所有信息而无需解密任何内容);但是,可以采取以下步骤来克服这一弱点:
-
使用 Diffie-Hellman 协议生成的会话密钥,并与授权和消息密钥结合使用以选择 AES 参数。要创建这些消息,客户端在创建新会话后必须做的第一件事就是向服务器将响应的服务器发送特殊的RPC查询("生成会话密钥"),从而会话中的所有后续消息也使用会话密钥进行加密。
-
使用(文本)密码保护存储在客户端设备上的密钥;此密码永远不会存储在内存中,由用户在启动应用程序时或更频繁地输入(取决于应用程序设置)。
-
存储在用户设备上(缓存)的数据也可以通过使用授权密钥进行加密来保护,而授权密钥又是密码保护的。然后,甚至需要密码才能访问该数据。
-
时间同步
如果客户端时间与服务器时间相差很大,则服务器可能会开始忽略客户端消息,反之亦然,因为消息标识符无效(与创建时间密切相关)。在这些情况下,服务器将向客户端发送一条包含正确时间和特定 128 位 salt 的特殊消息(由客户端在特殊的 RPC 同步请求中显式提供,或者等于当前会话期间从客户端收到的最新消息的密钥)。此消息可能是包含其他消息的容器中的第一条消息(如果时间差异很大,但尚未导致客户端的消息被忽略)。
收到这样的消息或保存它的容器后,客户端首先执行时间同步(实际上,只需存储服务器的时间与其自身时间之间的差异,以便将来能够计算"正确"时间),然后验证消息标识符的正确性。
如果忽略了更正,则客户端必须生成一个新会话,以确保消息标识符的单调性。