No description
  • Swift 52.6%
  • C++ 41.7%
  • C 5.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Vindroid Shaw 61daae6972 chore: 🎉 begin new project!.
chore: 🔥 删除xcodeproj文件夹
2026-08-04 15:15:21 +08:00
app chore: 🎉 begin new project!. 2026-08-04 15:15:21 +08:00
arduino/passpwd_esp32 chore: 🎉 begin new project!. 2026-08-04 15:15:21 +08:00
.gitignore chore: 🎉 begin new project!. 2026-08-04 15:15:21 +08:00
README.md chore: 🎉 begin new project!. 2026-08-04 15:15:21 +08:00

PassPwd

在手机上填好用户名 / 密码 / 2FA(可用系统或第三方密码管理器自动填充),点一下按钮, 由 M5StickC Plus 当作蓝牙键盘把它们敲进目标电脑——适合那些不让粘贴、或者根本没法用 密码管理器的登录界面(BIOS、虚拟机控制台、远程桌面、别人的电脑等)。

iPhone ──Wi-Fi AP + HTTP(HMAC-SHA256 签名)──> M5StickC Plus ──BLE HID──> 目标电脑
目录 内容
arduino/passpwd_esp32/ ESP32 固件(Arduino)。详见 固件 README
app/ iOS App(SwiftUI),用 XcodeGen 生成工程

为什么是 BLE HID 而不是 USB HID

M5StickC Plus 用的是 ESP32-PICO-D4,没有原生 USB 外设(USB 口后面是 CH9102 串口芯片), 硬件上无法枚举成 USB 键盘。只有 ESP32-S2/S3 系列才能做 USB HID。因此键盘那一侧用 BLE HID, 手机那一侧用 Wi-Fi AP,两者互不干扰。

快速开始

1. 烧录固件

arduino-cli compile --fqbn m5stack:esp32:m5stack_stickc_plus arduino/passpwd_esp32
arduino-cli board list   # 找到串口
arduino-cli upload -p /dev/cu.usbserial-XXXX --fqbn m5stack:esp32:m5stack_stickc_plus arduino/passpwd_esp32

2. 生成并运行 App

cd app
xcodegen generate
open PassPwd.xcodeproj

在 Xcode 里选自己的开发者账号(Signing & Capabilities)后真机运行。

3. 配对与使用

  1. 设备屏幕上会显示 SSID / PW(热点密码)/ IP / PIN(按 BtnA 显示明文)。
  2. 目标电脑:蓝牙里搜索并配对 PassPwd KB,成功后设备右上角变 BLE OK。
  3. 手机:连上 PassPwd-XXXX 热点 → 打开 App → 填 PIN → 点「连接」,状态变绿。
  4. 填好用户名 / 密码 / 2FA,把电脑上的光标放到输入框里,点对应的发送按钮。

BtnB 长按 2 秒可重置 PIN 与热点密码。

安全模型

  • 热点是 WPA2 加密的;每个 /v1/type 请求还要带 PIN 派生的 HMAC-SHA256 签名和严格递增的计数器, 同一网段的其他设备既伪造不了也重放不了。
  • 凭据只在 RAM 中短暂存在:App 不落盘(只有设备地址和 PIN 存 Keychain), 固件处理完立刻把缓冲逐字节抹掉,不写 NVS、不打日志、不上屏。
  • 这不是端到端加密的方案——设备默认只在你自己开的、无外网的热点里工作,别把它接到公共网络。

限制

  • 只支持 US 键盘布局,目标电脑用其它布局时符号会敲错。
  • 非 ASCII 字符(中文等)无法通过 HID 敲出,会被跳过。