ameshdev/amesh

GitHub: ameshdev/amesh

这是一个基于 P-256 ECDSA 加密设备身份的 M2M 认证工具,旨在通过私钥签名机制替代 API 密钥以杜绝静态机密泄露。

Stars: 1 | Forks: 0

# amesh **设备绑定的 M2M 认证。用加密设备身份替代 API 密钥。** 不需要 `.env` 文件。CI 中没有机密信息。Slack 中没有令牌。私钥保留在您的设备上 --- 没有任何内容会泄露。 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/28a3b178d1012909.svg)](https://github.com/ameshdev/amesh/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-emerald.svg)](./LICENSE) ## 使用前后对比 ``` // Before: static secret that can leak fetch("/api/orders", { headers: { Authorization: `Bearer ${process.env.API_KEY}` } }); ``` ``` // After: device-bound signature, nothing to leak import { amesh } from '@authmesh/sdk'; amesh.fetch("/api/orders", { method: "POST", body: JSON.stringify({ amount: 100 }) }); ``` 无需 `.env`。无需机密。请求使用永不离开您机器的 P-256 ECDSA 密钥进行签名。 ## 安装 ``` npm install @authmesh/sdk # signing client + verification middleware npm install -g @authmesh/cli # CLI for device management ``` ## 快速开始 ### 1. 创建设备身份 ``` amesh init --name "prod-api" # 身份已创建。 # Device ID : am_cOixWcOdI8-pLh4P # Backend : Secure Enclave # Friendly Name : prod-api ``` ### 2. 配对两台机器 在目标(服务器)上: ``` amesh listen # 配对代码:482916 # 输入 Controller 上显示的 6 位数字。 # 验证码:847291 # ✔ "my-laptop" 已添加为 controller。 ``` 在控制器(您的笔记本电脑)上: ``` amesh invite 482916 # 验证码:847291 # 在 Target 设备上输入此代码。 # ✔ "prod-api" 已添加为 target。 ``` 信任是单向的:控制器可以向目标进行身份验证,但反之则不行。 ### 3. 签名请求(2 行代码) ``` import { amesh } from '@authmesh/sdk'; const res = await amesh.fetch('https://api.example.com/data', { method: 'POST', body: JSON.stringify({ amount: 100 }) }); ``` ### 4. 验证请求(2 行代码) ``` import { amesh } from '@authmesh/sdk'; app.use(amesh.verify()); // req.authMesh.deviceId, req.authMesh.friendlyName available ``` ## 工作原理 - **设备身份** --- 每台机器获得一个唯一的 P-256 ECDSA 密钥对。私钥受操作系统密钥链、TPM 2.0(Linux)或加密文件(云 VM)保护,永不离开设备。 - **单向信任** --- 控制器向目标进行身份验证,反之则不行。被入侵的服务器无法回连到您的笔记本电脑。 - **签名请求** --- 每个 HTTP 请求都使用设备的私钥进行签名。签名涵盖方法、路径、时间戳、nonce 和正文。 - **重放保护** --- 每个请求都有一个唯一的 nonce 和 30 秒的时间戳窗口。Nonce 在服务端进行跟踪。 - **无静态机密** --- 没有字符串会泄露、轮换或共享。使用 `amesh revoke` 立即吊销被入侵的设备。 ## 软件包 | 软件包 | 描述 | |---------|-------------| | [`@authmesh/sdk`](./packages/sdk) | 签名 fetch 客户端 + Express 验证中间件 | | [`@authmesh/cli`](./packages/cli) | CLI:`init`、`listen`、`invite`、`list`、`revoke`、`provision` | | [`@authmesh/core`](./packages/core) | 加密原语:签名、验证、规范字符串、nonce、HMAC、HKDF、ECDH | | [`@authmesh/keystore`](./packages/keystore) | 密钥存储驱动:Secure Enclave、macOS Keychain、TPM 2.0、加密文件 | | [`@authmesh/relay`](./packages/relay) | 用于设备配对握手的 WebSocket 中继 | ## 架构 ``` [Pairing — one time] Target (server) <--WebSocket--> Relay <--WebSocket--> Controller (laptop) (P-256 ECDH + ChaCha20-Poly1305 + SAS verification) [Runtime — every request] Controller ----HTTP + AuthMesh header----> Target (one-way trust, no relay, stateless) ``` 中继仅用于初始配对握手。设备交换公钥后,所有身份验证均为无状态 HTTP 头。信任是单向的:控制器向目标进行身份验证,但目标无法反向进行身份验证。可以关闭中继,所有现有配对继续工作。 ## 自托管 amesh 完全独立。无 SaaS,无遥测,无回连。 - 从 npm 安装软件包(MIT 许可) - 运行您自己的中继:Docker、Cloud Run、Fly.io、Kubernetes 或直接使用 Bun - 所有数据保留在您的机器上(`~/.amesh/`) 有关部署选项,请参阅 [自托管指南](./docs/self-hosting.md)。 ## 文档 | 文档 | 描述 | |-----|-------------| | [集成指南](./docs/integration-guide.md) | Express、微服务、webhooks、远程配对的教程 | | [自托管指南](./docs/self-hosting.md) | 部署中继:Docker、Cloud Run、Fly.io、Kubernetes | | [使用指南](./docs/guide.md) | CLI 命令、SDK 用法、加密原语 | | [协议规范](./docs/protocol-spec.md) | 完整协议规范 (v2.0.0) | | [架构决策](./docs/architecture-decisions.md) | 针对每个设计决策的 ADR | | [为什么选择 amesh](./docs/why-amesh.md) | amesh 解决的问题 | ## 语言支持 amesh 目前提供 **TypeScript/Node.js SDK**。该协议与语言无关(标准 HTTP 头 + ECDSA-P256 签名),因此可以用任何语言实现验证。Python 和 Go 的 SDK 已在计划中。 ## 将 amesh 与 AI 助手配合使用 amesh 旨在易于与 Claude、Copilot 和 Cursor 等 AI 编码助手集成。这些软件包具有完整的 TypeScript 类型,且 API 表面极小。 **示例提示词:** - "帮我用 amesh 保护我的 Express API,替代 API 密钥" - "在我的 Node.js 服务中设置 `amesh.fetch()` 以调用经过身份验证的端点" - "使用 Redis nonce 存储配置 amesh,以进行多实例生产部署" - "为我的微服务添加 amesh 设备身份验证" SDK 有两个主要功能:`amesh.fetch()`(客户端)和 `amesh.verify()`(服务端中间件)。仅此而已。 ## 开发 ``` bun install # install all deps bun run build # turbo build (tsc -b per package) bun run test # tests across all packages bun run lint # eslint + prettier ``` ## 许可证 [MIT](./LICENSE)
标签:API安全, API密钥替换, CVE, ECDSA, GNU通用公共许可证, JSONLines, JSON输出, M2M认证, MITM代理, Node.js, P-256, SOC Prime, 中间件, 加密, 双向认证, 安全飞地, 开发工具, 数字签名, 无密钥, 漏洞扫描器, 环境变量, 私钥保护, 网络安全, 自动化攻击, 设备身份认证, 设备配对, 身份与访问管理, 隐私保护, 零信任