V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
44670
V2EX  ›  分享创造

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

  •  7
     
  •   44670 · 2022-01-26 22:47:01 +08:00 · 10541 次点击
    这是一个创建于 827 天前的主题,其中的信息可能已经有所发展或是发生改变。
    由于直接用密码不方便并且不安全,相信很多人都会配置使用公私钥来登录 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 登录啦。

    项目地址:
    硬件(准备中): https://oshwhub.com/44670/miniusbkey
    固件: https://github.com/44670/44Key
    PC 端软件: https://github.com/44670/44KeyTool

    目前是一个可以在 Windows 上工作的原型,实现了 SSH 认证所需的全部功能,不过安全启动和存储加密还没默认启用。

    欢迎提供各种想法!
    第 1 条附言  ·  2022-02-25 14:41:52 +08:00
    EDIT:
    做了一款带屏幕的硬件:
    103 条回复    2023-08-14 20:05:58 +08:00
    1  2  
    SoldierJazz2020
        101
    SoldierJazz2020  
       262 天前
    @adoal 沁恒现在好多 USB 转串口支持 VCP 和 CDC 的双协议,每个芯片出厂都内置唯一的 SN 序列号了。单串口的话,CH343 芯片,CH9101 、CH9102 都可以的哈,我们项目就一直在用。https://special.wch.cn/zh_cn/produce/
    @ysc3839 我们用了很多年的 CH340 也没遇到你这个问题呀,而且沁恒现在大部分都是 CDC 和 VCP 双串口协议了,完全不用担心驱动的问题。有问题,还可以直接找原厂,比国外支持方便多了。
    SoldierJazz2020
        102
    SoldierJazz2020  
       262 天前
    @CallMeReznov 之前确实遇到过这个问题,内核更新了驱动没有及时更新。不过好在 github 上发现了这个,后面都是从这个上面 pull 下来用了,https://github.com/WCHSoftGroup/ch341ser_linux
    SoldierJazz2020
        103
    SoldierJazz2020  
       262 天前
    之前遇到过别人用 CH343 做的一个简单加密 dongle ,1 是因为这个芯片出厂时有一个 Unique ID ,其次是部分型号的 USB 描述符,信息参数可以二次配置。通过计算机的软件代码可以获取,计算加密信息。
    不晓得对这个项目来说,是否实用~
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   732 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:22 · PVG 05:22 · LAX 14:22 · JFK 17:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.