keytar

关注
义项:Node.js密钥管理库
keytar

keytar是一个用于管理操作系统钥匙串的原生Node.js模块,提供读取、写入、替换和删除密码等凭据的接口[1]。它由Atom编辑器团队维护,在macOS上对接Keychain,在Linux上通过Secret Service API与libsecret工作,在Windows上使用凭据保管库(Credential Vault)[1]。该模块曾被Visual Studio Code、Element Desktop等桌面应用用于保存访问令牌与密码[2]。仓库于2022年12月被归档,最后一个版本为7.9.0[3]。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

keytar是一个原生Node.js模块,作用是读取、添加、替换和删除操作系统钥匙串中的密码[4]。它并不自己实现加密存储,而是对各平台的系统凭据接口做了一层封装,使JavaScript代码可以用统一的接口访问操作系统的密钥环[5]。这个模块的代码仓库位于GitHub上的atom/node-keytar,npm包名为keytar[6]。

按照平台划分,macOS上的密码由Keychain管理,Linux上由Secret Service API与libsecret管理,Windows上则由凭据保管库管理[4]。在Rust等语言中也有对应的同功能绑定[4]。

原理

keytar以原生模块(native addon)的形式实现,用C++编写并编译为二进制扩展,通过Node.js的本地插件机制被JavaScript调用[7]。调用时先通过require引入模块,其导出的每个函数都是异步的,返回Promise对象;发生错误时Promise被拒绝,否则以函数的返回值完成[4]。

在具体实现上,Linux端依赖libsecret。安装模块之前,Debian与Ubuntu系统需要先安装libsecret-1-dev,Red Hat系需要安装libsecret-devel,Arch Linux则通过pacman安装libsecret[4]。各次发布都附带针对Node与Electron当前受支持版本预编译的二进制文件[4]。

模块的数据模型是「服务名加账户名」组成的二元标识,密码与该组合一一对应。主要接口包括:getPassword用于按服务与账户取回密码,找不到时返回null;setPassword用于保存或更新密码;deletePassword用于删除条目;findCredentials用于列出某个服务下的全部账户与密码;findPassword则用于只需服务名的场景[4]。

发展历程

该项目的GitHub仓库创建于2013年4月25日,采用MIT许可证,主要实现语言为C++,主题标签包括凭据存储、密钥环与libsecret[7]。它长期作为Node.js生态中较成熟的操作系统钥匙串绑定库存在,被VS Code、Electron与Yeoman等较早的项目所依赖[8]。

2022年2月,项目发布7.9.0版本,这也是它的最后一个版本;同年12月12日仓库完成最后一次推送,并于2022年12月15日被归档为只读状态[3]。归档之后,OpenSSF的评分卡将其「是否被积极维护」一项评为0分,理由即项目已归档[9]。

使用方的迁移随之展开。Visual Studio Code在1.80版本开始把SecretStorage API的后端由keytar换成Electron的safeStorage,并保留了从keytar读取旧数据的迁移逻辑[2]。到2023年9月的稳定版,keytar被彻底移出VS Code;原先用于关闭持久化的命令行开关也由--disable-keytar改名为--use-inmemory-secretstorage[2]。MongoDB Compass同样在1.41.0版本转向safeStorage,并保留了一段时间的自动迁移[10]。

在替代方案方面,社区出现了若干分支包,例如重新打包以覆盖多平台预编译产物的@hackolade/keytar,以及按API兼容方式改写为Rust与N-API实现的@napi-rs/keyring。

应用

keytar的典型用途是让命令行工具与桌面应用不必把访问令牌、数据库口令等敏感信息写进配置文件。VS Code的扩展曾长期通过它保存机密数据;在此之前,官方推荐的正是直接引用keytar[2]。Element Desktop也采用过「优先使用Electron safeStorage、不可用时回退到keytar」的策略来处理加密密钥等机密[11]。

在桌面端之外,一些无图形界面的服务端程序也把它作为可选的原生依赖延迟加载,以便在存在系统密钥环时启用持久化存储[12]。Zowe等项目则把原先直接引用node-keytar的代码改为使用自有的keyring模块[13]。

对这些使用者来说,keytar的价值在于把「凭据放在哪里」交给操作系统统一管理,应用本身只负责业务逻辑[8]。

局限

原生模块的构建方式是keytar最主要的使用门槛。安装过程先尝试下载预编译二进制,一旦下载因网络波动超时,就会回退到用node-gyp从源码编译;而构建镜像中往往没有Python与C++工具链,这一步失败会导致整个安装中止[3]。在Windows上,从源码编译还需要额外的构建工具[8]。

版本兼容同样是问题。7.9.0的预编译产物只覆盖到Node 17的N-API ABI,在Node 20或22上会找不到可用的预编译文件而退回源码编译路径[8]。由于不同平台需要各自的二进制,扩展若要自带该模块,就得为每个目标平台分别发布包[2]。

功能边界上,keytar只负责存取密码字符串,密钥的生成、轮换与加密策略不在其职责范围内。它依赖底层系统组件,Linux端必须有libsecret,若运行环境缺少可用的密钥环服务,相关能力便无法启用[4]。这与Electron的safeStorage形成对照——后者只提供字符串加解密方法,不提供键值存储[14]。

项目已归档、不再接受维护这一事实本身构成了长期风险:依赖它会继续累积兼容性问题,而它也已不再承担密码学层面的更新[3]。

参见

  • Node.js —— keytar以原生模块形式运行于其上的JavaScript运行时。

  • Visual Studio Code —— 曾长期依赖keytar存储扩展机密的代码编辑器,后改用safeStorage。

  • Electron —— 提供safeStorage API的桌面应用框架,被多个项目用作keytar的替代方案。

  • libsecret —— Linux端的Secret Service API实现,keytar在Linux上的底层依赖。

  • 钥匙串 —— keytar所操作的操作系统凭据存储机制。

  • Node Package Manager —— keytar以npm包的形式分发。

参考资料

  1. atom/node-keytar: Native Password Node Module · GitHub [引用日期2026-10-14]
  2. v1_83 [引用日期2026-10-14]
  3. gitlab.com 上的网页 [引用日期2026-10-14]
  4. keytar - Node module to manage system keychain [引用日期2026-10-14]
  5. @github/keytar - npm Package Security Analysis [引用日期2026-10-14]
  6. keytar - npmarrow_drop_down [引用日期2026-10-14]
  7. https://github.com/atom/node-keytar - Ecosyste.ms: Awesome [引用日期2026-10-14]
  8. Node-keytar:把密码交还给操作系统钥匙串 | Kimi Gao [引用日期2026-10-14]
  9. keytar - npmarrow_drop_down [引用日期2026-10-14]
  10. Remove keytar completely [引用日期2026-10-14]
  11. deepwiki.com 上的网页 [引用日期2026-10-14]
  12. Saving DB passwords for the SQL Run feature [引用日期2026-10-14]
  13. Topics [引用日期2026-10-14]
  14. github.com 上的网页 [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T19:25:43Z

历史版本

本条目引用的词条
Node.js Visual Studio Code Electron libsecret 钥匙串 Node Package Manager