使用 Touch ID 实现安全便捷的钥匙串访问

发布: (2026年1月6日 GMT+8 21:01)
3 min read
原文: Dev.to

Source: Dev.to

问题

在终端访问 macOS 钥匙串中存储的密码时,你会面临安全与便利的两难:

security find-generic-password -a "user@example.com" -s "myapp" -w

macOS 会弹出对话框:

“security” 想要使用你钥匙串中 “myapp” 项目的机密信息。
[Deny] [Allow] [Always Allow]

选项 1:每次点击 “Allow”

  • 每次都需要输入 Mac 密码
  • 安全但不方便

选项 2:点击 “Always Allow”

  • 任何脚本都可以在不进行身份验证的情况下访问此密码
  • 方便但不安全

解决方案:Touch ID 认证

我创建了 keychain-fingerprint,一个使用 Touch ID 进行钥匙串访问的 CLI 工具。

好处

方面传统 (security)keychain-fingerprint
身份验证Mac 密码(慢)Touch ID(即时)
安全性“Always Allow” = 不安全始终需要 Touch ID
便利性输入密码或全部允许一次触摸

工作原理

┌─────────────────────────────────────────┐
│         keychain-fingerprint            │
├─────────────────────────────────────────┤
│  1. Touch ID 认证                       │
│  2. 访问钥匙串(自动授权)               │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│         其他应用 / 终端                 │
├─────────────────────────────────────────┤
│  钥匙串访问 → Mac 密码提示               │
└─────────────────────────────────────────┘
  • 此应用:可以使用 Touch ID 访问它自己创建的项目(自动授权)。
  • 其他应用:仍需使用 Mac 密码才能访问这些项目。

安装

# 克隆
git clone https://github.com/dss99911/keychain-fingerprint.git
cd keychain-fingerprint

# 编译
swiftc -o keychain-fingerprint main.swift \
    -framework LocalAuthentication \
    -framework Security

# 安装(可选)
sudo cp keychain-fingerprint /usr/local/bin/

用法

保存密码

keychain-fingerprint set myapp user@example.com
# Touch ID 提示 → 输入密码(隐藏)

读取密码

# 直接输出
keychain-fingerprint get myapp user@example.com

# 推荐:捕获到变量中
PASSWORD=$(keychain-fingerprint get myapp user@example.com)
echo "Password retrieved"
unset PASSWORD  # 完成后清除

列出已保存的项目

keychain-fingerprint list

删除密码

keychain-fingerprint delete myapp user@example.com

安全特性

  • 所有命令均需要 Touch ID 认证。
  • 密码以加密形式存储在 macOS 钥匙串中。
  • 输入密码时不回显(隐藏)。
  • 仅限本设备访问(kSecAttrAccessibleWhenUnlockedThisDeviceOnly)。
  • 其他应用仍需使用 Mac 密码。

要求

  • 带 Touch ID 的 macOS(配备 Touch ID 的 MacBook Pro/Air,或配有 Touch ID 的 Apple Silicon Mac 键盘)。
  • Xcode 命令行工具。

源代码

完整源代码已在 GitHub 上提供:dss99911/keychain-fingerprint

相关

想了解使用 root 权限而非 Touch ID 的另一种实现方式,请参见:How to always allow Mac keychain password only by specific app

Back to Blog

相关文章

阅读更多 »

Lyra:命令行助手

我为助手编写了框架和主循环。之所以选择 CLI 助手而不是语音或 AI 助手,是因为我的硬件限制。我……

各种 less(1) 技巧

文章 URL: https://blog.thechases.com/posts/assorted-less-tips/ 评论 URL: https://news.ycombinator.com/item?id=46464120 积分: 19 评论: 6