Skip to main content
使用操作系统的本地凭据存储 API 安全地存储和检索敏感凭据。
此 API 是新的且处于实验阶段,未来可能会发生变化。
index.ts

概览

Bun.secrets 提供了一个跨平台 API,用于管理敏感凭据,这些凭据通常由 CLI 工具和开发应用以明文形式存储在 ~/.npmrc~/.aws/credentials.env 等文件中。它使用:
  • macOS:钥匙串服务
  • Linux:libsecret(GNOME Keyring、KWallet 以及其他 Secret Service 守护进程)
  • Windows:Windows 凭据管理器
所有操作均为异步且非阻塞,运行在 Bun 的线程池中。
此 API 主要适用于本地开发工具。之后我们可能会为生产环境部署密钥添加 provider 选项。

API

Bun.secrets.get(options)

检索已存储的凭据。
参数:
  • options.service (字符串,必填)- 服务或应用名称
  • options.name (字符串,必填)- 用户名或账号标识符
返回值:
  • Promise<string | null> - 存储的密码,找不到时返回 null

Bun.secrets.set(options)

存储或更新凭据。
参数:
  • options.service (字符串,必填) - 服务或应用名称
  • options.name (字符串,必填) - 用户名或账号标识符
  • options.value (字符串,必填) - 要存储的密码或机密
注意:
  • 如果给定的服务/名称组合已存在凭据,则会将其替换
  • 存储的值由操作系统加密

Bun.secrets.delete(options)

删除存储的凭据。
参数:
  • options.service (字符串,必填)- 服务或应用名称
  • options.name (字符串,必填)- 用户名或账号标识符
返回值:
  • Promise<boolean> - 如果删除成功返回 true,找不到则返回 false

示例

存储 CLI 工具凭据

从明文配置文件迁移

错误处理

更新凭据


平台行为

macOS(钥匙串)

  • 凭据存储在用户的登录钥匙串中
  • 首次使用时,钥匙串可能会请求访问权限
  • 凭据在系统重启后仍会保留
  • 存储凭据的用户可以访问

Linux(libsecret)

  • 需要 GNOME Keyring 或 KWallet 等机密服务守护进程
  • 凭据存储在默认集合中
  • 如果钥匙串已锁定,可能会提示解锁
  • 机密服务必须正在运行

Windows(凭据管理器)

  • 凭据存储在 Windows 凭据管理器中
  • 可在控制面板 → 凭据管理器 → Windows 凭据中查看
  • 使用 CRED_PERSIST_ENTERPRISE 标志持久化,因此凭据按用户进行隔离
  • 使用 Windows 数据保护 API 加密

安全考虑

  1. 加密:凭据由操作系统的凭据管理器进行加密
  2. 访问控制:只有存储该凭据的用户才能检索它
  3. 无明文存储:密码从不以明文形式存储
  4. 内存安全:Bun 使用后会将密码内存清零
  5. 进程隔离:凭据按用户账户进行隔离

限制

  • 最大密码长度因平台而异(通常为 2048-4096 字节)
  • 保持 servicename 足够简短(少于 256 个字符)
  • 根据平台的不同,某些特殊字符可能需要转义
  • 需要适当的系统服务:
    • Linux:必须运行 Secret Service 守护进程
    • macOS:必须可用钥匙串访问
    • Windows:必须启用凭据管理器服务

与环境变量的对比

与环境变量不同,Bun.secrets
  • ✅ 在静态存储时加密凭据(得益于操作系统)
  • ✅ 避免在进程内存转储中暴露机密(不再需要后会将内存清零)
  • ✅ 在应用重启后仍然保留
  • ✅ 无需重启应用即可更新
  • ✅ 提供用户级访问控制
  • ❌ 需要操作系统凭据服务
  • ❌ 对部署机密不太有用(生产环境请使用环境变量)

最佳实践

  1. 使用描述性服务名称:与工具或应用程序名称保持一致 如果你正在为外部使用构建 CLI,请使用 UTI(统一类型标识符)作为服务名称。
  2. 仅存储凭据:不要在此 API 中存储应用程序配置 此 API 速度较慢;请将非机密设置保存在配置文件中。
  3. 适用于本地开发工具
    • ✅ CLI 工具(gh、npm、docker、kubectl)
    • ✅ 本地开发服务器
    • ✅ 用于测试的个人 API 密钥
    • ❌ 生产服务器(建议使用专业的机密管理方案)

TypeScript 类型定义