Skip to content

Releases: IvyYang1999/KeyKeeper

KeyKeeper 0.3.4

Choose a tag to compare

@IvyYang1999 IvyYang1999 released this 14 Sep 14:13

KeyKeeper 0.3.4

适用于 Apple Silicon Mac,macOS 14 或更新版本。

建议升级:这一版把「谁可以用哪把 key」的记录搬进了钥匙串,并修了一批授权相关的安全问题。

  • 「始终允许」现在真的只对你批准的那个程序有效,本机别的程序蹭不到;没签名的 App 按它运行的文件认,不再按它自称的名字认。升级后已有的授权会各再问一次。
  • 授权窗改成三个回答:仅这一次、这次运行期间(程序退出就失效)、以后都不问。Agent 的留言放在正中,其余细节折叠。
  • 新安装默认「后台可用」的 key 也要先见过调用方一次才放行。
  • Agent 通过命令行写入的明文字段(区域、地址这类)要你在 KeyKeeper 里确认后,run 才会注入。
  • Agent 新建的凭据默认「只能注入、不能读出」:值只经 keykeeper run 进入命令的环境,get 和 SDK 拿不到;需要时在凭据页打开「允许读出」。
  • 可选的「独立审查员」:填一个 Anthropic 或 OpenAI 接口的服务和 key,它会在授权窗里给出「是否必要、范围是否最小」的意见。它看不到任何值,也不会替你批准。
  • 授权记录从明文文件搬进 macOS 钥匙串,别的程序改不了;旧文件改名留档,不再读取。
  • 授权窗写清楚这次批准覆盖的范围,认不出的程序只能批准这一次。
  • 在 KeyKeeper 自己的窗口里登录网站,登录态可以像 key 一样按次、按小时或长期交给一个 Agent,随时撤销。
  • 凭据可以记录过期日;Agent 新建凭据时可以建议保护方式和过期日,由你批准。
  • Agent 第一次请求一把 key 必须说明用途,授权窗里能看到;已批准过的不再需要。
  • Agent 新建凭据时要声明用途;之后每次请求,授权窗会并列显示它的要求和 KeyKeeper 的建议。可选开启一个独立审查员(另一个模型)给意见,它看不到任何值,也不会替你批准。
  • 从剪贴板保存:先复制还是先让 Agent 发命令都行,不再要求「请求之后再复制一次」。确认窗会显示开头结尾几个字符、长度和复制时间,认对了再存;不对就再复制,窗口会跟着变。
  • 命令行等待你批准时不再超时失败;元数据被外部改动时会提示并可确认恢复。
  • 修了字段名可能变成 PATH 这类环境变量、注册文件被改后无法修复等问题。

For Apple Silicon Macs, macOS 14 or later.

Recommended: approvals now live in the Keychain, and a batch of authorization fixes.

  • "Always allow" now applies only to the program you approved; nothing else on this Mac can ride on it, and an unsigned app is recognised by the file it runs from, not by the name it claims. Existing approvals will ask once more after upgrading.
  • The approval window offers three answers: just this once, while it runs (ends when the program quits), or don't ask again. The agent's message sits in the middle; details are folded away.
  • On a fresh install, "Background OK" keys are only released to callers you have seen once.
  • Plain fields an agent writes over the command line (a region, an address) are injected by run only after you confirm them in KeyKeeper.
  • Credentials an agent creates are inject-only: values reach a command's environment through keykeeper run and are never returned by get or the SDKs. Turn on "Can be read out" on a credential when you need that.
  • Optional independent reviewer: point it at any Anthropic- or OpenAI-style service with a key, and it adds an opinion on necessity and scope to the approval window. It never sees a value and never approves for you.
  • Approval records moved from plain files into the macOS Keychain, where other programs cannot edit them. The old files are kept, renamed, and no longer read.
  • The approval window states exactly what an approval covers; a program KeyKeeper cannot identify can only be approved once.
  • Log in to a website inside KeyKeeper's own window, and hand that login to an agent once, for an hour, or until you revoke it — just like a key.
  • Credentials can record an expiry date; an agent creating one can suggest its protection and expiry, for you to approve.
  • An agent's first request for a key must say what it is for, and the approval window shows it; approved callers need not repeat it.
  • An agent creating a credential declares its use; later requests show the agent's ask next to KeyKeeper's own suggestion. An optional independent reviewer (a second model) can add its opinion — it never sees a value and never approves for you.
  • Clipboard saves no longer require a copy made after the request: copy first or run the command first, either works. The confirmation shows the first and last characters, the length and when it was copied, so you can tell it is the right thing; copy again if not, and the window follows.
  • The command line no longer times out while you read an approval window; metadata changed outside KeyKeeper is flagged and can be confirmed.
  • Fixed field names that could become variables like PATH, and a Chrome registration that could not be repaired after tampering.

KeyKeeper 0.3.3

Choose a tag to compare

@IvyYang1999 IvyYang1999 released this 13 Sep 08:37

KeyKeeper 0.3.3

适用于 Apple Silicon Mac,macOS 14 或更新版本。

建议升级:修了两个安全问题。

  • 在 App 里复制密钥,不再跟着「通用剪贴板」同步到你的 iPhone 和 iPad。
  • 授权窗点「使用密码」会直接出密码框,不再先弹一次 Touch ID。
  • 从剪贴板存密钥时,只接受你在命令跑起来之后复制的那一次;可以先声明它应该长什么样(--expect base64:32),对不上就不存;存完会告诉你存了个什么形状。
  • 可以安全地替换已有字段(--replace),密钥也能先验明身份再入库。
  • 网站登录态那一页现在会告诉你扩展在哪、怎么装,连接改成一键完成。
  • 两个 SDK 可以写一句话说明为什么要用这把 key,会显示在授权窗里。

For Apple Silicon Macs, macOS 14 or later.

Recommended: two security fixes.

  • Copying a secret in the app no longer syncs to your iPhone and iPad over Universal Clipboard.
  • "Use Password" in the approval window now goes straight to the password field instead of showing Touch ID again.
  • Saving from the clipboard accepts only the copy you made after the command started. You can declare what the value should look like (--expect base64:32); a mismatch saves nothing. Every save reports the shape of what was stored.
  • Existing fields can be replaced safely (--replace), and a key can prove its identity before being stored.
  • The website sessions page now explains where the Chrome extension is and how to load it; connecting is one click.
  • Both SDKs can pass a one-line reason, shown in the approval window.

KeyKeeper 0.3.2

Choose a tag to compare

@IvyYang1999 IvyYang1999 released this 13 Sep 05:38

KeyKeeper 0.3.2

下载与安装 / Installation

适用于 Apple Silicon Mac(M1 及后续芯片),macOS 14 或更新版本。打开 DMG,将 KeyKeeper 拖到 Applications,再启动 App。CLI 可从 App 的设置向导安装。

Requires an Apple Silicon Mac and macOS 14 or later. Open the DMG, drag KeyKeeper into Applications, and launch it. Install the bundled CLI from the setup assistant.

本次更新:非机密字段

一把密钥旁边常常还有几个并不机密、却每次都要一起用的值——Apple ID、团队 ID、账号邮箱、区域。以前它们只能当密钥存,于是每次取用都要验一次 Touch ID。现在它们是一等公民。

  • 每个字段可以标为「机密」或「明文」。 机密值继续存在 macOS 钥匙串里;明文值存在 KeyKeeper 自己的元数据文件里,不加密,任何能读你用户目录的程序都能看到——所以只放本来就不怕被看见的东西。
  • keykeeper run 会一并注入明文字段,不弹窗、不记审计、不参与脱敏。整条凭据里若一个机密字段都没有,run 全程不需要授权。
  • 命令行可直接写明文字段:keykeeper edit <凭据> --set apple-id=you@example.com、--unset apple-id。它碰不到机密字段——对机密字段用 --set 会被拒绝。
  • 界面上可以互相转换。 详情页每一行都有「机密 / 明文」菜单。转成明文要确认一次(值会从钥匙串挪到元数据文件,并明确告诉你这意味着什么);转回机密不需要确认。
  • 明文字段在详情页直接显示、可复制,标着「明文」,不再看着像「值丢了」。

What's new: non-secret fields

A key usually travels with a few values that are not secret but are needed every single time — an Apple ID, a team ID, a region. Storing them as secrets meant a Touch ID check for every use. They are now first-class.

  • Each field is either secret or plain. Secret values stay in the macOS Keychain. Plain values live in KeyKeeper's metadata file in the clear — anything that can read your home directory can read them, so only put things there that you don't mind being read.
  • keykeeper run injects plain fields too, with no approval window and no audit entry. A credential with no secret fields at all never asks for approval.
  • Write them from the command line: keykeeper edit <credential> --set apple-id=you@example.com and --unset apple-id. It refuses to touch secret fields.
  • Convert either way in the app. Every row in the detail view has a secret/plain menu. Converting to plain asks once and explains where the value is going; converting back to secret does not ask.

修复 / Fixes

  • 【可能丢值】同一次编辑里既给字段改名、又把它转成明文时,钥匙串里的旧值会在写 meta.json 之前被删掉。中间只要出错或崩溃,值就两边都没有了。

  • 【安全】凭据标题会成为授权窗最上面那行粗体字,而改标题按设计不弹窗——本机任一进程都能把某条凭据改名成一句像系统文案的话再来请求授权。现在标题和「调用方留言」一样按敌意文本处理:折成一行、去掉不可见字符与 bidi 覆盖、限长。

  • 转明文之后如果钥匙串里的旧值没能删掉,会明确告诉你这个值现在同时存在两处,不再静默。

  • 明文字段那一套界面文案补齐了中文——包括「移出钥匙串」这个破坏性确认按钮,之前是中英混排。

  • run 注入时,明文字段的旧名不再硬占环境变量:撞上任何现名都安静让位(和机密字段一个规矩)。

  • 启动时不再每次去读钥匙串来记「曾经建过库」这个标记;标记在了就完全不读,要读也走非交互的读法。

  • 保存编辑时的完整性检查以前是全库判断:库里只要有一条凭据缺值,所有凭据都改不了,连给缺值的那条补录也做不了。现在只检查正在编辑的这一条,并明确放行补录;读不到密钥库时一律拒绝保存。

  • 「绝不自动重建空库」这条防线以前靠「元数据里还有机密字段」推断。若把最后一个机密字段转成明文,防线会自己关掉。现在建过库就永久留标记。

  • Possible value loss: renaming a field and converting it to plain in the same save deleted the Keychain copy before the metadata was written. Any error in between lost the value from both places.

  • Security: a credential's title becomes the authorization window's headline, and renaming is deliberately promptless — so any local process could rename a credential to something that reads like system text and then ask for approval. The title is now treated as hostile text, like a caller's stated reason: one printable line, no invisible or bidi characters, capped.

  • If the old Keychain copy cannot be removed after converting to plain, KeyKeeper now says so instead of staying quiet.

  • The save-time integrity check used to look at the whole store: one credential with missing values blocked edits to every other credential, including re-entering the missing values. It now checks only the credential being edited, explicitly allows re-entry, and still refuses to save if the store cannot be read at all.

  • The "never silently rebuild an empty store" guard used to infer its state from whether any secret fields remained. Converting the last secret field to plain switched the guard off. The store now carries a permanent marker instead.

升级注意 / Upgrade notes

明文字段不加密。把一个真正的密钥转成明文,等于把它写进磁盘上的普通文件。

Plain fields are not encrypted. Converting a real secret to plain writes it to an ordinary file on disk.

KeyKeeper 0.3.1

Choose a tag to compare

@IvyYang1999 IvyYang1999 released this 13 Sep 03:34

KeyKeeper 0.3.1

下载与安装 / Installation

适用于 Apple Silicon Mac(M1 及后续芯片),macOS 14 或更新版本。打开 DMG,将 KeyKeeper 拖到 Applications,再启动 App。CLI 可从 App 的设置向导安装。

Requires an Apple Silicon Mac and macOS 14 or later. Open the DMG, drag KeyKeeper into Applications, and launch it. Install the bundled CLI from the setup assistant.

安全修复(建议尽快升级)

  • 在授权窗点「使用密码」会直接放行。 Touch ID 面板上选择改用密码时,0.3.0 把这个信号当成验证通过,直接交出密钥值并关窗——任何人坐在这台 Mac 前都能这样绕过 Touch ID。现在选「使用密码」会真的走一次系统密码验证,验过才放行;验不了就报错并保留窗口。
  • 授权窗显示的凭据名和字段名曾由调用方自报。 本机任一进程可以一边申请 A 凭据、一边让弹窗显示 B 的名字,或少报字段让范围看起来更小。现在一律显示本地记录的名字与该凭据的全部机密字段;本地没有这条凭据则直接拒绝,不弹窗。

Security fixes (please update)

  • "Use Password" in the approval window released the secret without checking anything. Choosing the password fallback on the Touch ID sheet was treated as a successful check in 0.3.0, so anyone at the Mac could bypass Touch ID. It now runs a real device-password check and only releases the value if that check passes.
  • The credential name and key names in the approval window came from the caller. A local process could request one credential while the window displayed another's name, or under-report the keys involved. The window now shows what KeyKeeper has on file, lists every secret key the approval covers, and refuses requests for unknown credentials.

本次更新

  • 授权窗新增「调用方留言」:脚本或 Agent 可用 keykeeper run --reason "…" 写一句人话说明为什么要用这把 key。留言标注「未核实」、纯文本显示、折成一行并限长,永远不参与任何判定,也不改变允许之后的范围。
  • 授权时长旁补上一句实话:允许之后,这个调用方能读这一组里的全部密钥;「始终允许」对以后的会话同样有效。
  • 修复展开「调用方详情」时窗口底部短暂露出直角、失去磨砂的问题(展开动画期间玻璃跟不上窗口)。

What's new

  • Callers can state their case: keykeeper run --reason "…" puts one line in the approval window, labelled unverified, plain text, folded to a single line and capped. It never affects any decision.
  • The duration picker now says plainly what an approval covers: every key in that credential, and future sessions for "Always allow".
  • Fixed the approval window briefly showing square, unfrosted corners while the caller details expanded.

升级注意 / Upgrade notes

密钥继续保存在 macOS 钥匙串中。此安装包不会找回已经缺失的密钥值。

Secrets remain in macOS Keychain. This installer cannot recover secret values that are already missing.

KeyKeeper 0.3.0

Choose a tag to compare

@IvyYang1999 IvyYang1999 released this 12 Sep 10:47

KeyKeeper 0.3.0

下载与安装 / Installation

适用于 Apple Silicon Mac(M1 及后续芯片),macOS 14 或更新版本。打开 DMG,将 KeyKeeper 拖到 Applications,再启动 App。CLI 可从 App 的设置向导安装。

Requires an Apple Silicon Mac and macOS 14 or later. Open the DMG, drag KeyKeeper into Applications, and launch it. Install the bundled CLI from the setup assistant.

本次更新

  • 列表与详情明确区分“值缺失/待恢复”和“暂时无法检查”,并指出缺失字段;检查不弹密码框、不修改值。meta 返回 valueStatus,status --check-values 可查看全体凭据状态。

  • 新增独立主窗口,集中管理密钥、网站登录态、调用方授权、访问记录和设置。

  • 菜单栏集中显示待确认请求与最近凭据;支持简体中文与英文。

  • 安全导入支持浏览器粘贴、系统剪贴板、受支持的 Python 源码常量和服务账号 JSON 文件;密钥值不进入 Agent 对话。

  • 文件凭据可显式映射为受控的临时文件供子进程使用。

  • Chrome 网站登录态功能为预览版,仅导入用户选定的网站,每次打开都需确认。

  • 修复编辑未显示的密钥时重命名字段丢值,以及调用方断开后确认窗口残留的问题。

  • 支持签名更新提示;自动安装默认关闭,可在设置中启用。

名字、备注与改名(2026-09-12 补记)

  • 列表和详情里那个给脚本与 Agent 用的名字改称「组 ID」,可一键复制;字段名可选中复制。
  • 字段多了「显示名」:你可以随手写「千帆 API Key」,机器用的字段名单独保存,它决定注入的环境变量名。
  • 人和 Agent 都能改组 ID 与字段名(keykeeper edit,不弹确认窗)。旧名永久保留:run -c 旧组ID 照样能用,旧的环境变量名也会和新的一起注入,已有脚本不会断。每次改动都记在 App 里,菜单栏会告诉你是谁改了什么。
  • 服务账号 JSON 文件在列表与详情里用文件图标标明,并显示文件中不保密的 client_email 与 project_id(私钥不显示、不可复制)。
  • 菜单栏改成系统「密码」那样的浮窗:只做搜索和存入两件事,存入只有一个加号。
  • 备注里的网址可以直接点开;访问记录把同一调用方的重复读取合并计数,并解释「未询问即读取」的含义,可一键改成「先问我」。

Highlights

  • A dedicated main window and a compact menu bar, with Chinese and English interfaces.
  • Native-confirmed secret imports and managed credential-file injection.
  • A preview of selected Chrome website sessions with per-launch confirmation.
  • Safer field editing, missing-value recovery and disconnected-caller handling.
  • Signed update notifications and optional automatic installation, off by default.
  • Group IDs and field names can be renamed by you or your agent (keykeeper edit, no prompt); old names keep working forever and run still injects the old variable names.
  • Optional per-field display names, clickable links in notes, and service-account files marked as files with their non-secret client_email and project_id shown.
  • A menu bar rebuilt around two jobs: search and save.

升级注意 / Upgrade notes

0.3.0 正式安装包启用新的自动更新签名身份。使用旧签名公钥的内部测试版请手动安装本次 DMG 一次;不要依赖旧测试版自动更新到本版。新安装包仍默认关闭自动安装,可在设置中自行开启。

This release establishes a new update-signing identity. Internal test builds using the old public key require a one-time manual installation of this DMG. Automatic installation remains off by default and can be enabled in Settings.

密钥继续保存在 macOS 钥匙串中。此安装包不会找回已经缺失的密钥。若你仍使用早期 age/passphrase 存储版本,或 App 正在提示旧数据缺失,请先保留旧 App 与数据备份,完成迁移或恢复后再替换;不要重置钥匙串或删除旧存储。

Secrets remain in macOS Keychain. This installer cannot recover missing secret values. If you still use an experimental age/passphrase build or see missing-storage warnings, preserve the old App and backups and complete migration/recovery before replacing it. Do not reset the Keychain or delete legacy storage.