如何用Golang/JavaScript获取Ledger Nano设备序列号或读写唯一ID?
Ledger Nano S/X 唯一标识获取方案
JavaScript 实现
依赖安装
npm install @ledgerhq/hw-transport-webusb @ledgerhq/hw-app-hw
代码示例
import TransportWebUSB from "@ledgerhq/hw-transport-webusb"; import HwApp from "@ledgerhq/hw-app-hw"; async function fetchLedgerSerial() { const transport = await TransportWebUSB.create(); const hwApp = new HwApp(transport); const deviceInfo = await hwApp.getDeviceInfo(); const serial = deviceInfo.serialNumber; console.log("设备序列号:", serial); await transport.close(); return serial; } // 调用执行 fetchLedgerSerial().catch(err => console.error("获取失败:", err));
通过Ledger官方WebUSB传输库调用getDeviceInfo接口,可直接获取设备出厂序列号,该序列号为设备唯一标识。
Golang 实现
依赖安装
go get github.com/LedgerHQ/ledger-go/hid
代码示例
package main import ( "fmt" "github.com/LedgerHQ/ledger-go/hid" ) func main() { devices, err := hid.ListDevices() if err != nil { fmt.Println("设备列表获取失败:", err) return } if len(devices) == 0 { fmt.Println("未检测到Ledger设备") return } device, err := hid.Open(devices[0].Path) if err != nil { fmt.Println("设备连接失败:", err) return } defer device.Close() // 发送获取设备信息的APDU指令 apdu := []byte{0xE0, 0x01, 0x00, 0x00, 0x00} response, err := device.Exchange(apdu) if err != nil { fmt.Println("指令发送失败:", err) return } if len(response) >= 16 { serial := string(response[:16]) fmt.Println("设备序列号:", serial) } else { fmt.Println("响应数据异常,无法解析序列号") } }
通过HID库连接设备后,发送标准APDU指令0xE001000000,响应数据前16字节即为设备ASCII格式的唯一序列号。
自定义唯一ID写入说明
Ledger Nano S/X不支持用户直接写入全局自定义唯一ID,原因如下:
- 设备固件采用安全封闭设计,无公开API允许修改全局设备标识,防止恶意篡改破坏设备完整性。
- 仅允许在自定义开发的Ledger应用存储区内写入数据(需通过Ledger开发者框架开发并部署应用),且该数据仅能在对应应用内读取。
替代方案
若需绑定用户与设备,建议:
- 将设备出厂序列号与用户ID在后端系统建立映射关系。
- 开发专属Ledger应用,在应用存储区写入用户关联标识,通过应用接口读取验证。
内容的提问来源于stack exchange,提问作者Muhammed Jishin Jamal TCP
相关产品推荐
相关产品推荐

