jianshuo.dev/a
🔐 VoiceDrop · 设备配对登录

新设备怎么登录老账号

VoiceDrop 这个录音 app 不用注册、没有密码——你的身份,就是手机钥匙串里的一串密钥。那么换一台设备、或者想让电脑上的脚本以「你」的身份干活,要怎么登录?

1先说清楚难在哪

大多数工具的「登录」背后都有一个中心服务器:它认得你(浏览器里有会话),你点一下「授权」,它就替你的账号签发一个 token 发给新设备。Claude Code 的 /logingh auth login 都是这套。

VoiceDrop 偏偏没有这个中心权威。它的匿名身份是这样算出来的:

你的空间 = users/anon-<sha256(密钥)>/

服务器根本不存这串密钥——你每次请求带上它,服务器当场哈希一下,就知道该开哪个空间。持有密钥 = 就是你。

这带来一个硬约束:服务器没法凭空签发一个指向你账号的新 token(那等于要破解 sha256)。所以「在新设备上登录」,本质只有一条路——把老设备上那串密钥,安全地搬到新设备

2三段式:6 位定位 + 4 位验证 + 实时推送

怎么「安全地搬」?用一套设备配对握手。新设备只知道一个公开的 6 位短码,剩下的全靠老设备在场证明 + 端到端加密。

📟 新设备
☁️ 服务器
📱 老设备(手机)
① 输入手机上看到的 6 位短码 →
输入 6 位短码
+ 生成临时密钥对
按前缀找到匹配账号
② 服务器把一个 4 位验证码推给老设备 →
生成 4 位码
经长链接推送
弹卡:验证码 1234
③ 你把手机上的 4 位码,输进新设备 ←(人眼搬运)
输入 1234
校验 ✓
通知老设备放行
收到「放行」信号
④ 老设备把密钥加密后交出,服务器只过密文 ←
解密 → 拿到密钥
登录完成 ✓
中转密文
(看不到明文)
用新设备的公钥
加密密钥

4 位码只会出现在真主人那台已登录的设备上(手机弹卡)。别人就算猜中你的 6 位短码,也看不到这 4 位——它压根不发给他。

3为什么这样是安全的

🔢 4 位码:5 次机会 / 2 分钟过期。暴力破解约 5/10000,而且——真主人会在自己手机上看到这次登录尝试。被攻击是看得见的。

🔒 密钥全程端到端加密(X25519 + AES-GCM)。新设备先发一个临时公钥,老设备用它加密密钥,服务器只中转密文、从不解密、不留存

🛂 只有持有账号的设备能放行。服务器强制「放行者的身份 = 被登录的账号」——别的设备替不了你点这个头。

4顺手把终端也登录了:/vd-login

同一套握手,新设备那一半换成命令行就行——服务器一行都不用改。于是有了一个小工具,让电脑/脚本从手机登录你的账号:

# 1. 报上手机「设置 → 账户」里的 6 位短码
$ vd-login start AE209A
→ 手机弹出验证码 9046

# 2. 把手机上的 4 位码输进来
$ vd-login finish 9046
→ ✅ 登录成功,凭证存进 ~/.config/voicedrop/

之后别的工具读这个凭证,就能以你这个具体账号的身份调 API(比如把录音挖成文章),不用再共享一把「能看所有人」的管理员钥匙。

一个诚实的代价。搬过去的是账号的全权密钥本体,不是受限的、可单独吊销的子令牌(匿名身份签不出那种)。谁拿到那个凭证文件,就有这个账号的全部权限,而且没法只把这一台机器踢下线。所以——别提交、别同步到任何可读的地方。

这套机制已经在生产环境跑通:手机弹码、命令行接住、密钥端到端搬过去、解密成功。整篇讲的就是它背后那点「没有中心权威,怎么还能安全登录」的小心思。

jianshuo.dev/a · 由 Claude Code 生成 · 回到 归档 / 首页