小米米家设备初始化流程详解:mihome-binary-protocol协议握手与加密机制
小米米家设备初始化流程详解:mihome-binary-protocol协议握手与加密机制
【免费下载链接】mihome-binary-protocol项目地址: https://gitcode.com/gh_mirrors/mi/mihome-binary-protocol
想要完全掌控你的小米智能家居设备吗?本文将深入解析小米米家设备初始化流程的完整技术细节,特别是mihome-binary-protocol协议的握手过程与加密机制。作为一款专为智能家居设备设计的二进制协议,mihome-binary-protocol是小米设备与手机App通信的核心技术,理解它的工作原理能帮助你更好地管理和控制自己的智能设备。
什么是mihome-binary-protocol协议?
mihome-binary-protocol是小米智能家居设备使用的加密专有网络协议,运行在UDP端口54321上。这个协议负责设备初始化、配置和控制的所有通信过程。通过逆向工程和协议分析,开源社区已经成功解密了这一协议,让用户能够摆脱对官方App的依赖,重新获得对自己设备的完全控制权。
设备初始化握手流程详解
小米设备的初始化过程被称为"SmartConnect",这是设备与客户端建立安全通信连接的关键步骤。
第一步:Hello包发送
初始化过程从客户端向设备发送一个特殊的"Hello包"开始。这个包的结构非常独特:
- 魔法数字:固定为0x2131
- 包长度:固定为0x0020(32字节)
- 未知字段1:设置为0xFFFFFFFF
- 设备ID:设置为0xFFFFFFFF
- 时间戳:设置为0xFFFFFFFF
- MD5校验和:16字节全为0xFF
这个Hello包可以在任何时候发送,设备总是会返回相同的响应。在miio.py源码中,你可以看到相关的包结构定义。
第二步:设备响应与令牌获取
设备收到Hello包后,会返回一个包含重要信息的响应包:
- 魔法数字:同样为0x2131
- 包长度:固定为0x0020
- 未知字段1:设置为0x00000000
- 设备ID:设备的真实ID(如0x12345678)
- 时间戳:递增计数器
- 设备令牌:128位的设备令牌
这个128位的设备令牌是整个通信安全的基础,所有后续的加密通信都基于这个令牌。值得注意的是,根据2017年2月23日的更新,只有未初始化的设备才会在响应中泄露令牌。
加密机制深度解析
mihome-binary-protocol使用AES-128加密算法保护通信内容,加密密钥和初始化向量都从设备令牌派生而来。
密钥派生过程
密钥派生算法在miio.py的key_iv函数中实现:
def key_iv(token: bytes) -> (bytes, bytes): """Derive (Key, IV) from a Xiaomi MiHome device token (128 bits).""" key = md5(token) iv = md5(key + token) return (key, iv)具体步骤:
- 密钥生成:Key = MD5(Token)
- 初始化向量生成:IV = MD5(MD5(Key) + Token)
加密模式与填充
协议采用CBC(Cipher Block Chaining)加密模式,并使用PKCS#7填充方案。在doc/PROTOCOL.md文档中详细描述了加密算法的技术细节。
WiFi配置过程的安全隐患
设备初始化过程中最关键的步骤之一是配置WiFi网络。在doc/PROTOCOL.md中提到的miIO.config_router命令负责这一过程:
{ "id": 1234567890, "method": "miIO.config_router", "params": { "ssid": "WiFi网络名称", "passwd": "WiFi密码", "uid": 987654321 } }重要安全提醒:由于弱加密问题,WiFi凭据可能会在初始化过程中泄露。因此,不建议将小米智能设备连接到主WiFi网络,建议使用专门的IoT网络或访客网络。
协议包结构详解
每个mihome-binary-protocol包都遵循固定的32字节头部结构:
| 字段 | 长度 | 描述 |
|---|---|---|
| 魔法数字 | 2字节 | 固定为0x2131 |
| 包长度 | 2字节 | 包括头部的总字节数 |
| 未知字段1 | 4字节 | 通常为0,Hello包中为0xFFFFFFFF |
| 设备ID | 4字节 | 设备唯一标识符 |
| 时间戳 | 4字节 | 递增计数器 |
| MD5校验和/令牌 | 16字节 | 校验和或设备令牌 |
| 数据载荷 | 可变 | AES加密的JSON数据 |
在miio.py的print_head函数中可以看到如何解析这个头部结构。
实用工具与代码示例
pcap-decrypt.py分析工具
pcap-decrypt.py是一个强大的协议分析工具,可以从网络抓包文件中恢复和解密协议数据:
./pcap-decrypt.py capture.pcapng.gz这个工具依赖于:
- Python 3.5+
- tshark(Wireshark命令行版本)
- PyShark(Python包装器)
- cryptography库
核心库功能
miio.py库提供了完整的协议实现:
- 包加密:
encrypt函数生成加密包 - 包解密:
decrypt函数解密接收到的包 - 密钥派生:
key_iv函数从令牌生成密钥和IV - 包解析:
MiioPacket类处理包的结构
安全建议与最佳实践
- 网络隔离:将智能设备放在独立的IoT网络中
- 固件更新:定期检查设备固件更新
- 令牌保护:设备令牌是通信安全的关键,务必妥善保管
- 协议监控:使用提供的工具监控设备通信
技术实现细节
在miio.py中,加密和解密函数展示了协议的具体实现:
def AES_cbc_encrypt(token: bytes, plaintext: bytes) -> bytes: """Encrypt plain text with device token.""" key, iv = key_iv(token) padder = padding.PKCS7(128).padder() padded_plaintext = padder.update(plaintext) padded_plaintext += padder.finalize() cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=_backend) encryptor = cipher.encryptor() return encryptor.update(padded_plaintext) + encryptor.finalize()总结
通过深入理解mihome-binary-protocol的初始化流程和加密机制,你可以更好地掌控自己的小米智能家居设备。这个开源项目不仅提供了技术文档,还提供了实用的工具来分析和解密协议通信,让你摆脱对专有软件的依赖。
记住,知识就是力量——了解你的设备如何工作,是确保安全和隐私的第一步。😊
提示:所有技术细节和实现代码都可以在项目的doc/PROTOCOL.md和miio.py文件中找到。
【免费下载链接】mihome-binary-protocol项目地址: https://gitcode.com/gh_mirrors/mi/mihome-binary-protocol
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
