
花不到8美元自制YubiKey:ESP32实现硬件双因素认证
Diebug为什么我要花8美元做一把”假”YubiKey?
说实话,我从来没有买过YubiKey。不是因为用不起,而是因为我总觉得,如果我能自己做一个功能相同的设备,为什么要花25到70美元去买一个” glorified USB dongle”呢?
经过一番研究,我发现了一个令人惊喜的事实:硬件安全密钥的核心技术并没有那么神秘。FIDO2和U2F协议根本不需要昂贵的安全芯片,只需要一个能够处理USB HID通信和椭圆曲线密码学的微控制器。
而这,正是ESP32-S3擅长的事。
硬件安全密钥的工作原理
什么是FIDO2和U2F?
FIDO2(Fast Identity Online 2)和它的前身U2F(Universal Second Factor)是开放的身份认证标准,用于替代传统的密码和第二因素认证方法。
核心原理:
- 密钥对生成:设备生成唯一的公钥/私钥对
- 挑战-响应:服务器发送随机挑战,设备用私钥签名
- 公钥验证:服务器用注册的公钥验证签名
- 用户确认:设备通过触摸按钮确认身份
为什么比密码更安全?
- 私钥永远不会离开设备
- 每个网站使用不同的密钥对
- 无法被钓鱼攻击(密钥与特定域名绑定)
- 需要物理触摸才能确认
安全芯片真的是必需的吗?
很多人认为硬件安全密钥必须有安全 enclave(安全区域),但实际上:
事实:
- FIDO2协议本身不要求TPM 2.0或安全芯片
- 只要微控制器能处理USB HID通信
- 能执行ECDSA(NIST P-256曲线)签名运算
- 就能实现完整的FIDO2功能
这意味着:
便宜的ESP32系列开发板完全可以胜任,不需要昂贵的安全芯片。
材料清单
核心部件
| 部件 | 型号 | 价格 | 用途 |
|---|---|---|---|
| 开发板 | ESP32-S3-DevKitC-1 | $6-8 | 主控制器 |
| USB线 | USB-C to USB-A | $1 | 编程和供电 |
| 外壳 | 3D打印或现成 | $0-3 | 保护壳体 |
可选部件
- LED指示灯:$0.5(状态反馈)
- 按钮:$0.3(用户确认)
- 小型面包板:$1(原型测试)
总计:不到8美元
相比YubiKey 5 NFC的$70,这是90%的成本节省。
软件准备
推荐固件:DiyTopia/DipYubi
DipYubi是一个开源的FIDO2固件,专门为ESP32设计:
特性:
- 完整的FIDO2和U2F支持
- 多账户存储
- 简单的外观设计
- 活跃的社区支持
GitHub仓库:https://github.com/DiyTopia/DipYubi
开发环境搭建
方法一:PlatformIO(推荐)
- 安装VS Code
- 安装PlatformIO插件
- 克隆DipYubi仓库
- 使用PlatformIO编译和上传
方法二:Arduino IDE
- 安装Arduino IDE
- 添加ESP32开发板支持
- 下载DipYubi源码
- 编译上传
方法三:esptool.py
- 安装Python和esptool
- 编译固件为.bin文件
- 使用esptool上传到设备
组装步骤
第一阶段:原型测试
连接开发板
- 使用USB-C线连接ESP32-S3到电脑
- 确认驱动已正确安装
上传固件
- 打开PlatformIO项目
- 点击上传按钮
- 等待编译和上传完成
测试功能
- 访问test.yubico.com
- 插入设备,按按钮
- 验证FIDO2认证是否成功
第二阶段:集成外设
添加LED指示灯
- 连接到GPIO引脚
- 配置闪烁模式表示状态
- 绿色:正常,红色:错误
添加物理按钮
- 连接到GPIO引脚
- 配置为触摸确认
- 测试按下响应
电源管理
- ESP32-S3可以通过USB供电
- 无需额外电池
- 低功耗模式可选
第三阶段:外壳封装
设计外壳
- 使用3D打印定制外壳
- 或使用现成的电子元件盒子
- 确保按钮和LED可操作
组装
- 将电路板放入外壳
- 固定螺丝或胶水
- 测试整体功能
实际使用体验
兼容性测试
支持的网站和服务:
- Google( Gmail、YouTube、Drive等)
- Microsoft(Outlook、Azure等)
- GitHub
- Twitter/X
- Discord
- 1Password
- Bitwarden
- 其他支持FIDO2的服务
测试结果:
- 100%兼容主流FIDO2服务
- 响应速度快(约200ms)
- 无明显延迟或错误
性能对比
| 特性 | DiyYubiKey | YubiKey 5 NFC |
|---|---|---|
| 价格 | $8 | $70 |
| FIDO2支持 | ✓ | ✓ |
| U2F支持 | ✓ | ✓ |
| NFC支持 | ✗ | ✓ |
| 蓝牙支持 | ✗ | ✓(部分型号) |
| 耐久性 | 中等 | 高 |
| 外观 | 实用 | 精致 |
长期使用的问题
需要考虑的问题:
- 数据保留:断电后密钥是否会丢失?(取决于固件实现)
- 固件更新:能否像YubiKey一样更新固件?
- 耐用性:外壳和按钮的寿命如何?
- 备份机制:如果设备丢失怎么办?
进阶玩法
添加RFID/NFC功能
如果你对NFC功能感兴趣,可以使用ESP32-A1S或添加RFID模块:
- 实现类似YubiKey NFC的功能
- 支持NFC触发认证
- 成本增加约$3-5
多账户管理
高级固件支持存储多个密钥对:
- 切换账户:长按按钮切换
- 账户数量:取决于存储容量
- 安全隔离:每个账户独立密钥
自定义外观
使用3D建模软件设计个性化外壳:
- Blender或Fusion 360
- 3D打印或激光切割
- 涂上喜欢的颜色
安全注意事项
保护你的私钥
虽然私钥存储在本地,但仍需注意:
- 不要共享设备:私人密钥不应该被其他人使用
- 备份恢复码:如果服务提供恢复码,妥善保管
- 监控账户:定期检查登录活动
- 物理保护:防止设备被他人物理访问
固件来源
只使用可信的开源固件:
- 从官方GitHub仓库下载
- 检查代码仓库的活跃度和维护情况
- 避免使用来源不明的固件
与其他方案的比较
DIY vs 购买YubiKey
选择DIY的理由:
- 成本极低
- 学习嵌入式开发的机会
- 完全自定义功能
- 支持开源社区
选择购买YubiKey的理由:
- 即用即享,无需组装
- 经过严格安全测试
- 保修和技术支持
- 外观和耐用性更好
我的建议:
如果你享受动手制作,DIY版本是个很好的入门项目。但对于生产环境或重要账户,建议使用经过认证的YubiKey。
DIY vs 软件双因素认证
| 特性 | 硬件密钥 | 软件TOTP | SMS认证 |
|---|---|---|---|
| 安全性 | 最高 | 高 | 低 |
| 便利性 | 中 | 高 | 最高 |
| 成本 | $0-70 | 免费 | 手机费用 |
| 抗钓鱼 | ✓ | ✗ | ✗ |
| 离线可用 | ✓ | ✓ | ✗ |
硬件密钥仍然是最安全的第二因素认证方式。
总结
用ESP32-S3自制YubiKey是一个兼具教育意义和实用价值的DIY项目。你不仅能节省大量的金钱,还能深入理解FIDO2协议和硬件安全认证的工作原理。
核心价值:
- 成本优势:8美元 vs 70美元
- 学习价值:理解硬件安全认证原理
- 定制自由:完全可控的功能和外观
- 开源生态:丰富的社区支持和文档
当然,这不意味着YubiKey没有价值。对于追求极致可靠性和便捷性的用户,购买成品仍然是更好的选择。但如果你热爱DIY,这个 projects绝对值得尝试。
在这个黑客文化盛行的时代,能用8美元做出价值70美元的功能,本身就是最大的满足感。
来源:MakeUseOf
