使用 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