做了一个用于登录 SSH 的 USB Key,成本低至 9.9 元

# 44KeyA simple, cheap, and somewhat secure USB Key for SSH authentication, costs < $5由于直接用密码不方便并且不安全,相信很多人都会配置使用公私钥来登录 SSH 主机。然而,直接在电脑里存储私钥文件实际上是非常不安全的:电脑上任何一个能读取用户目录的软件都有可能偷走私钥然后做坏事。比较可信赖的方式是做一个专门的 USB Key 设备,实现 SSH 登录时用到的公私钥认证算法,这样一来电脑上就不会存储私钥了。YubiKey 支持 SSH 登录,但是除了价格问题以外,另一个问题是 YubiKey 对 SSH 登录的支持不是原生的,在 Windows 下需要依赖 Windows Crypto API/SmartCard API 这些黑箱,其它平台上也需要 OpenPGP 这样的软件套一至多层实现,配置起来可能会很复杂并且总觉得不够可靠。所以我觉得有必要自己做一个专门用于登录 SSH 的 USB Key ,并且尽量简化功能和降低成本。基于以下几点原因,最后选择了 ESP32/ESP32-C3 芯片:1. ESP32 系列自带安全启动、存储加密功能,一定程度上可以防止硬件上的秘密被物理读取。2. 价格非常便宜,目前淘宝上卖得最多的一家 ESP32-C3 开发板只需 9.9 元(限购 10 件)。3. 有 WiFi/BLE 功能,未来或许可以做成无线的。已经在 ESP32 开发板上测试通过,几乎所有的 ESP32/ESP32-C3 开发板都可以直接使用。也在计划做自己的硬件,打算提供一个带灯的按钮,用户按下物理按钮可以确认登录操作。PC 端用 Go 实现了一个 ssh-agent ,可以转发 SSH 身份认证请求到设备端、由设备端完成签名操作。特点:1. 设备端只专注 ed25519 签名一件事情,代码<1K LOC (不含第三方库),容易审计。2. 私钥完全在设备端产生,不会传递到外部,不依赖 Windows Crypto API/SmartCard API 之类的黑箱。3. 私钥通过 SHA256 算法,结合设备端存储的随机种子+用户密码产生。设备本身不存储 /验证某个特定的用户密码,用户每次输入不同的密码即可以直接使用不同的 ed25519 公私钥对。4. 使用外部的独立 USB 转串口芯片,避免软件 USB 协议栈的潜在漏洞影响设备的安全性。5. 可以通过单一的 Go 写的工具,实现设备的初始化、ssh-agent 等全部功能,不需要安装额外的软件。使用方法:1. 安装 ESP-IDF 环境、构建 44Key 项目后刷入任意一个 ESP32/ESP32-C3 开发板里。2. 运行 44KeyTool -port COMx -format ,初始化设备。需要在键盘上随便输入些字符,用于给设备端生成随机种子提供一部分熵。(在设备管理器里确认具体的串口号,替换 COMx )3. 运行 44KeyTool -port COMx ,输入自己的密码后,即可开启 ssh-agent ,此时终端会显示输出公钥。4. 把公钥添加到目标服务器的~/.ssh/authorized_keys ,下次就可以直接用 USB Key 登录啦。项目地址:硬件(准备中): 固件: PC 端软件: 目前是一个可以在 Windows 上工作的原型,实现了 SSH 认证所需的全部功能,不过安全启动和存储加密还没默认启用。欢迎提供各种想法!

请登录后发表评论

    没有回复内容