No description
- Go 93.5%
- HTML 6.5%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
CI / test (push) Successful in 1m26s
- .gitignore 'encryptData*' also matched docs/encryptData.md, so the file never got committed; scope the pattern to the repo root instead - drop FAQ.md / unlock_guide.md / docs index (covered by the README) - add a Chinese encryptData principle section; switch the remaining doc link to an absolute Gitea URL (relative links 404 on the web UI) |
||
| .gitea/workflows | ||
| docs | ||
| .gitignore | ||
| captcha.html | ||
| fastboot.go | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| login.go | ||
| main.go | ||
| main_test.go | ||
| migate.go | ||
| README.md | ||
| ui.go | ||
| unlock.go | ||
mi-unlock-go
小米 Bootloader 解锁工具 MiForge/MiUnlockTool(含其登录库 offici5l/migate,均为 Apache-2.0)的 Go 移植版。登录小米账号 → 从官方解锁 API 换取 encryptData 签名 → fastboot stage + fastboot oem unlock 完成解锁。全平台单二进制,无 Python 依赖。
构建
go build -trimpath -ldflags="-s -w -X main.version=v0.1.0" -o mi-unlock-go .
go test ./... # 含与 Python/openssl 独立实现的签名交叉验证
使用
mi-unlock-go # 默认浏览器登录
mi-unlock-go -terminal # 终端账号密码登录(含验证码/2FA 短信或邮件)
mi-unlock-go -qr # 扫码登录
mi-unlock-go -zone China # 强制 dataCenterZone(一般自动识别,不用管)
mi-unlock-go -fastboot /path/to/fastboot
流程:登录账号(支持会话缓存,与 Python 版共用 ~/.migatesession/unlockApi/session.json)→ 自动识别账号区域与 dataCenterZone → 手机进 fastboot 模式(不是 fastbootd)插上电脑 → 工具读取 product 与设备 token → 服务器签名返回 encryptData → 自动 fastboot stage + oem unlock。
前提
- 账号已在手机上完成绑定(设置 → 开发者选项 → Mi Unlock 状态 → 添加账号和设备),且 168 小时等待期已满——本工具不绕过等待期,与官方流程等价
- 解锁会清除用户数据(工具会提前提示该机型是否清数据)
- fastboot 在 PATH 中(Arch:
pacman -S android-tools)
返回码对照(完整)
整理自原项目 miunlock-codes-reference.md(会持续更新)。
| code | 含义 | 常见原因 | 解决办法 |
|---|---|---|---|
| 10000 | 请求参数错误 | deviceToken 或 product 无效 | 重启工具重试;确认使用最新版本 |
| 10013 | 设备未激活,请先激活 | 换过主板、IMEI 变更、分期购机、使用了自定义 DNS | 关闭自定义 DNS;SIM 换到另一个卡槽;关闭并重新开启"查找手机";用移动数据(不要 Wi-Fi)在 小米账号→云服务 里开启"通话记录与消息"同步,再到 设置→小米账号→设备→当前设备 确认 SIM 显示已激活;开发者选项重新绑定账号。约 24 小时后仍不行就联系小米 |
| 10013 | 设备激活不足 7 天 | SIM 卡尚未激活 | 同上一行的步骤;等满提示的时间(7 天,UTC+8)再跑 |
| 10013 | 设备激活时间太短 | 购机/激活还不满 7 天 | 等提示的小时数过去后再跑 |
| 10023 | 无法解锁更多设备 | 2025 年起每个账号每年只能解 1 台 | 换新账号,或等一年 |
| 20030 | 本月无法解锁更多设备 | 本月已经取过一次 encryptData | 等下个月 1 日再试 |
| 20031 | 请在开发者选项中添加账号 | 账号未绑定 Mi Unlock 状态 | 开发者选项 → Mi Unlock 状态 → 同意 → 添加账号和设备;已绑定仍报错就在工具里手动指定 dataCenterZone |
| 20033 | 账号无解锁权限,请换账号 | 账号因可疑行为被服务器风控 | 先尝试开启"查找设备";无效则换新账号 |
| 20035 | 请升级解锁工具 | clientVersion 过旧 | 官方工具下最新版;本 Go 版的 clientVersion 写在 unlock.go(7.6.727.43),被拒时按服务器要求调高 |
| 20036 | 请在 *** 小时后再解锁 | 正常等待期,机型不同时长不同 | 到期再跑;期间不要在 MIUI 里重新添加账号,否则从头再等;若倒计时不减或重置为 144 小时,说明账号已被封,换号 |
| 20038 | 该手机已被账号 **** 通过查找手机锁定 | 设备被某账号定位锁定 | 用该账号登录 i.mi.com/mobile/find → 选中设备 → 关闭"定位设备" |
| 20039 | 设备基础数据校验失败 | deviceToken 不完整,缺少必需数据 | 暂无确认解法 |
| 20041 | 小米 ID 未绑定手机号 | 账号没有关联手机号 | 给账号绑定手机号;App 里没有入口就用这个链接:https://account.xiaomi.com/pass/serviceLogin?checkSafePhone=true |
| 20045 | 请使用官网普通用户工具 | 服务器区域无效 | 工具里换 dataCenterZone |
| 20045 | 账号注册地与手机销售地不符 | 账号区域和设备区域不匹配(例如国际账号解国行机) | 用与设备同区域的账号:国行机用国行账号 |
| 30002 | 无法解锁,请到小米社区申请授权 | 账号未绑定 Mi Unlock 状态,或社区授权未通过 | 先确认已绑定;已绑定仍报错就手动指定 dataCenterZone,或按提示去小米社区申请 |
encryptData 签名原理
encryptData 是小米服务器对设备 deviceToken 的私钥签名,解锁的本质就是拿到一个对自己设备有效的签名。整个流程分三步:
- 取 deviceToken:通过
fastboot oem get_token(或getvar token)从手机读取,内容包含固定版本号、机型代号(如 evergo)、CPU 唯一标识cpuid和一段随机数RAND。RAND每次开机都会重新生成,所以 token 每次重启都不同,encryptData也随之失效——这就是为什么必须到期当天现取现签,没法提前准备。 - 服务器签名:工具把 deviceToken 连同
pcId(deviceId 的 MD5)、机型代号等信息发到/api/v3/ahaUnlock。账号满足全部条件(已在手机上绑定本机、168 小时等待期满、月/年配额未超)时,服务器用只有它持有的私钥对 token 签名,返回encryptData。 - 设备验签解锁:把签名转成二进制后
fastboot stage写入手机,再执行fastboot oem unlock;bootloader 用固件里内置的小米公钥验签,通过即标记为永久解锁。
这也解释了几个常见现象:为什么解锁必须用绑定了账号的同一台手机、为什么等待期没到会返回 20036、为什么到期当天不需要提前下载任何文件。
与 Python 版的差异
- 单二进制、无 Python/pip 依赖;不支持 Termux 自动装 fastboot(自行安装)
- 不自动下载 platform-tools(用 PATH 里的 fastboot)
- 登录会话与 Python 版互通(同一路径、同一格式)
- 签名/加密逻辑(HMAC-SHA1 → AES-128-CBC → SHA-1)与原版逐字节一致,单元测试用 Python/openssl 独立参考值锁定
许可
Apache-2.0。移植自 offici5l 的 MiUnlockTool 与 migate,版权归原作者所有。