花不到8美元自制YubiKey:ESP32实现硬件双因素认证

为什么我要花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)是开放的身份认证标准,用于替代传统的密码和第二因素认证方法。

核心原理:

  1. 密钥对生成:设备生成唯一的公钥/私钥对
  2. 挑战-响应:服务器发送随机挑战,设备用私钥签名
  3. 公钥验证:服务器用注册的公钥验证签名
  4. 用户确认:设备通过触摸按钮确认身份

为什么比密码更安全?

  • 私钥永远不会离开设备
  • 每个网站使用不同的密钥对
  • 无法被钓鱼攻击(密钥与特定域名绑定)
  • 需要物理触摸才能确认

安全芯片真的是必需的吗?

很多人认为硬件安全密钥必须有安全 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(推荐)

  1. 安装VS Code
  2. 安装PlatformIO插件
  3. 克隆DipYubi仓库
  4. 使用PlatformIO编译和上传

方法二:Arduino IDE

  1. 安装Arduino IDE
  2. 添加ESP32开发板支持
  3. 下载DipYubi源码
  4. 编译上传

方法三:esptool.py

  1. 安装Python和esptool
  2. 编译固件为.bin文件
  3. 使用esptool上传到设备

组装步骤

第一阶段:原型测试

  1. 连接开发板

    • 使用USB-C线连接ESP32-S3到电脑
    • 确认驱动已正确安装
  2. 上传固件

    • 打开PlatformIO项目
    • 点击上传按钮
    • 等待编译和上传完成
  3. 测试功能

    • 访问test.yubico.com
    • 插入设备,按按钮
    • 验证FIDO2认证是否成功

第二阶段:集成外设

  1. 添加LED指示灯

    • 连接到GPIO引脚
    • 配置闪烁模式表示状态
    • 绿色:正常,红色:错误
  2. 添加物理按钮

    • 连接到GPIO引脚
    • 配置为触摸确认
    • 测试按下响应
  3. 电源管理

    • ESP32-S3可以通过USB供电
    • 无需额外电池
    • 低功耗模式可选

第三阶段:外壳封装

  1. 设计外壳

    • 使用3D打印定制外壳
    • 或使用现成的电子元件盒子
    • 确保按钮和LED可操作
  2. 组装

    • 将电路板放入外壳
    • 固定螺丝或胶水
    • 测试整体功能

实际使用体验

兼容性测试

支持的网站和服务:

  • 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支持 ✗ ✓
蓝牙支持 ✗ ✓(部分型号)
耐久性 中等 高
外观 实用 精致

长期使用的问题

需要考虑的问题:

  1. 数据保留:断电后密钥是否会丢失?(取决于固件实现)
  2. 固件更新:能否像YubiKey一样更新固件?
  3. 耐用性:外壳和按钮的寿命如何?
  4. 备份机制:如果设备丢失怎么办?

进阶玩法

添加RFID/NFC功能

如果你对NFC功能感兴趣,可以使用ESP32-A1S或添加RFID模块:

  • 实现类似YubiKey NFC的功能
  • 支持NFC触发认证
  • 成本增加约$3-5

多账户管理

高级固件支持存储多个密钥对:

  • 切换账户:长按按钮切换
  • 账户数量:取决于存储容量
  • 安全隔离:每个账户独立密钥

自定义外观

使用3D建模软件设计个性化外壳:

  • Blender或Fusion 360
  • 3D打印或激光切割
  • 涂上喜欢的颜色

安全注意事项

保护你的私钥

虽然私钥存储在本地,但仍需注意:

  1. 不要共享设备:私人密钥不应该被其他人使用
  2. 备份恢复码:如果服务提供恢复码,妥善保管
  3. 监控账户:定期检查登录活动
  4. 物理保护:防止设备被他人物理访问

固件来源

只使用可信的开源固件:

  • 从官方GitHub仓库下载
  • 检查代码仓库的活跃度和维护情况
  • 避免使用来源不明的固件

与其他方案的比较

DIY vs 购买YubiKey

选择DIY的理由:

  • 成本极低
  • 学习嵌入式开发的机会
  • 完全自定义功能
  • 支持开源社区

选择购买YubiKey的理由:

  • 即用即享,无需组装
  • 经过严格安全测试
  • 保修和技术支持
  • 外观和耐用性更好

我的建议:
如果你享受动手制作,DIY版本是个很好的入门项目。但对于生产环境或重要账户,建议使用经过认证的YubiKey。

DIY vs 软件双因素认证

特性 硬件密钥 软件TOTP SMS认证
安全性 最高 高 低
便利性 中 高 最高
成本 $0-70 免费 手机费用
抗钓鱼 ✓ ✗ ✗
离线可用 ✓ ✓ ✗

硬件密钥仍然是最安全的第二因素认证方式。

总结

用ESP32-S3自制YubiKey是一个兼具教育意义和实用价值的DIY项目。你不仅能节省大量的金钱,还能深入理解FIDO2协议和硬件安全认证的工作原理。

核心价值:

  1. 成本优势:8美元 vs 70美元
  2. 学习价值:理解硬件安全认证原理
  3. 定制自由:完全可控的功能和外观
  4. 开源生态:丰富的社区支持和文档

当然,这不意味着YubiKey没有价值。对于追求极致可靠性和便捷性的用户,购买成品仍然是更好的选择。但如果你热爱DIY,这个 projects绝对值得尝试。

在这个黑客文化盛行的时代,能用8美元做出价值70美元的功能,本身就是最大的满足感。

来源:MakeUseOf