更新
目前 pico-fido2 项目已转为商业发布模式,每台硬件需支付 25 美元授权费用。
同时项目已启用固件签名验证,刷入官方固件后将无法再刷入其他第三方固件。
因此本文所述的低成本自制安全密钥方案已失效,本文内容仅作为历史记录留存,不再推荐实际使用。
如有需要可以考虑如下项目
三年前,我通过 Cloudflare 和 Yubico 的活动购买了几枚超低价的 Yubico 5 NFC 安全密钥
平时一主一备使用,不幸的是我丢失了备用的密钥,只剩下主用的密钥
这导致平时使用时小心翼翼,生怕再次丢失主用的密钥
好巧不巧的是前一段时间又爆出 Yubico 老版本的固件存在漏洞问题,便心生打算再搞一个新的进行备用
因为 Yubico 5 NFC 的价格仍然很贵,并且看到存在自制硬件密钥的方案,综合成本大概是30元左右,那么用作备用就再好不过了
一、Pico Keys 项目
Pico Keys 是一个开源的 GitHub 项目,提供两个仓库版本,均可将 Raspberry Pi Pico 或 ESP32 等微控制器变成安全密钥:
-
仅支持 FIDO 的版本:pico-fido
- 支持 FIDO2 和 U2F 协议
- 支持 WebAuthn 认证
- 支持多种椭圆曲线(SECP256R1、SECP384R1、SECP521R1、SECP256K1、Ed25519)
- 支持 PIN 码和物理按钮验证
- 支持发现式凭证(Resident Keys)和凭证管理
- 支持 HMAC-Secret 和 CredProtect 扩展
-
支持 OpenPGP 的版本:pico-fido2
- 包含上述 FIDO 功能
- 支持 OpenPGP 智能卡功能
- 支持 RSA(1024–4096 位)和多种 ECC 曲线
- 支持 SHA1、SHA256、SHA384、SHA512 等摘要算法
- 支持 ECDSA 和 RSA 签名、ECDH 密钥派生
- 支持 PIN 码授权和 PKCS#11 接口
- 内置硬件随机数生成器
二、硬件选择
目前 Pico Keys 支持以下几款芯片及对应的开发板:
-
ESP32S3
- 内置 Wi-Fi 和蓝牙,适合无线认证场景
- 支持 USB OTG,可用作安全密钥
- 对于仅作为 USB 安全密钥的场景,ESP32 的无线能力并非优势,反而可能增加攻击面
-
RP2040 / RP2350
- RP2040 是 Raspberry Pi Pico 使用的芯片
- RP2350 是 Raspberry Pi Pico 2 使用的芯片
2.1 芯片推荐选择RP2350
-
RP2040 缺乏硬件级安全隔离与安全启动,在有物理接触 + 专业攻击条件下,密钥被提取的风险更高
-
RP2350 提供了 Secure Boot / Secure Lock / 签名校验能力,可以显著提高攻击门槛,但:
- 并不等价于 Secure Element(SE)
- 也不等价于 YubiKey 这类通过 FIPS/CC 认证的硬件
需要说明的是,RP2350 的安全能力仍然无法与商用安全密钥中使用的 Secure Element 相提并论,仅适合作为成本敏感或备用场景使用
2.2 推荐开发板Waveshare(微雪) RP2350-One
- 体积小巧,便于携带
- 市场价格低廉,1688约 34 元即可包邮购买
三、固件下载及制作
1. 固件下载
-
下载固件用于刷写开发版 pico_fido2_waveshare_rp2350_one-6.6.uf2
-
该固件用于重置或清空开发板存储 pico_nuke_waveshare_rp2350_one-1.4.uf2
2. 刷写固件
- 在按住
BOOT键的情况下将硬件插入电脑,此时硬件会显示为一个可存储的磁盘空间 - 将得到的固件文件放入U盘中,此时固件会被加载,文件管理器的页面会被关闭,同时会自动断开并连接硬件
- 此时硬件已经刷写完毕
3. 设备配置
前往项目官网进行设备配置 Pico Commissioner - Pico Keys
-
选择 Vendor 为 YubiKey 4/5
-
VID
参考 https://support.yubico.com/hc/en-us/articles/360016614920-YubiKey-USB-ID-values - 若设置为
1050:0407,则将被识别为 YubiKey 5 NFC (OTP+FIDO+CCID) - 可能和 Vendor 存在冲突,不可同时设置,wndows未成功完成设置
- 该方式本质上是通过 VID/PID 与设备描述信息实现兼容性伪装,仅用于个人测试和使用场景,不建议在企业或受控环境中使用
- 若设置为
-
Product Name 设置为
yubico yubikey,只有这样自制的硬件才能被 yubikey 相关的软件识别并管理。 -
LED brightness 设置为
1,数值越高,LED亮度越高 -
Options 开启
LED dimmableSecure BootSecure Lock,这三个选项,分别是LED控制、安全启动和安全锁- 特别注意,开启 Secure Boot 后默认只能运行 pico keys 官方签名固件,但也可以通过自签名方式运行自行构建的固件,以在安全性和可控性之间做取舍
- 如果不希望只能使用 pico keys 官方固件但希望开启Secure Boot,可以使用 自签名
4. 设备调试 (WebUSB):
- 点击
commissioned with WebUSB进行调试,并在弹窗中选择设备pico keys,随后重新插拔设备 - 点击
Commission via WebAuthn进行测试,第一次使用会要求设置PIN,之后使用此密钥、查看密钥信息都需要输入此PIN
5. 重置或清空开发板存储
-
同刷写固件步骤,在按住
BOOT键的情况下将硬件插入电脑,将清除固件文件放入磁盘空间中 -
此时固件会被加载,文件管理器的页面会被关闭,同时会自动断开并连接硬件
-
等待固件程序清除开发板存储,清除完毕会再次自动断开并连接usb设备,并显示可存储的磁盘空间
-
此时硬件已经清除完毕
四、使用方法
1. 按键与交互说明
Waveshare RP2350-One 开发板上有两个按键:
-
BOOT 键
- 用于进入刷写模式
- 也是 Pico Keys 在日常使用中的用户确认键(等同于安全密钥的触摸确认)
-
RESET 键
- 仅用于重启设备
- 不参与认证或确认操作
刷写固件或清空存储时,需要在按住 BOOT 键的情况下插入 USB,或在已插入 USB 时按住 BOOT 再按 RESET
日常使用时,直接插入设备,不要按任何按键。
2. 短按 / 长按 行为说明
RP2350-One 的按键不支持真正的硬件级长按检测,Pico Keys 通过按键节奏区分操作:
- 短按一次 BOOT 键:普通确认操作
- 连续快速按两次 BOOT 键:等效于“长按”
在凭证管理、OpenPGP 操作或部分管理场景中,可能需要使用“长按”行为。如果操作无响应,可以尝试连续按两下 BOOT 键
3. PIN 与管理密码
设备初始状态下使用默认凭据:
- 默认 PIN:
123456 - 默认 管理密码:
12345678
首次进行 WebAuthn / FIDO2 注册或管理操作时,系统会要求输入或设置 PIN 强烈建议首次使用后立即修改 PIN 和管理密码,否则在设备丢失时存在明显安全风险
4. 使用场景举例
常见使用流程如下:
- 将设备插入电脑 USB 接口
- 在网站或应用中触发安全密钥认证(如登录、注册)
- 浏览器或系统提示“请触摸安全密钥”
- 短按 BOOT 键完成确认
该流程适用于:
- WebAuthn / FIDO2 登录
- 支持 U2F 的旧系统
- 启用 OpenPGP 功能后的签名或认证操作(取决于固件配置)
5. 测试与管理工具
可通过以下网站测试 Pico Keys 是否工作正常:
设备管理与日常使用可配合以下工具:
- Yubico Authenticator
- YubiKey Manager
- ykman(命令行工具)
在查看设备信息、管理凭证或进行高级操作时,通常需要输入 PIN
非商业用途可以使用,但必须注明出处;
若有改编需采用相同许可协议发布。