工具大全
返回情报列表

码农早餐 · 2026-09-13

今日头菜:换了台 Mac,你的登录钥匙串打不开了:Tahoe 把密钥锁进了 Secure Enclave。另有 7 条快讯:7.2k 星、256 个 fork:worktrunk 把 git worktree 做成了一条命令;220 美元买来的 56 次安装:33 次是机器人;等。

2026年9月13日17 分钟阅读码农早餐

在 macOS Tahoe 上把 login.keychain-db 拷到另一台带 Secure Enclave 的 Mac,密码输对也解不开——元数据密钥被锁进了 Secure Enclave。我第一反应是:这不是 bug,是钥匙串从「一个文件」变成了「绑死这台机器」,跨机迁移的旧路子该重想了。

🍳 今日头菜当天唯一一条深度解读

换了台 Mac,你的登录钥匙串打不开了:Tahoe 把密钥锁进了 Secure Enclave

在 macOS Tahoe 上,把 login.keychain-db 从一台 Mac 拷到另一台 Mac,然后输入正确密码解锁——这条路走不通了,前提是这台机器带 Secure Enclave。原文作者做了完整的对照测试,结论很硬:密码没错,解锁照样失败。

先把东西说清楚。登录钥匙串是 macOS 给每个用户账号自动建的一个加密数据库,密码默认等于你的登录密码,所以你一登录它就自动解开。到 macOS Tahoe,它是个 SQLite 文件,名字叫 login.keychain-db,躺在 /Users/你的用户名/Library/Keychains 下面。历史上你把这个文件拷到另一台 Mac,输入钥匙串密码就能打开。现在不行了。

换了台 Mac,你的登录钥匙串打不开了:Tahoe 把密钥锁进了 Secure Enclave

原因在 Apple 自己的 Platform Security 文档里写着:钥匙串条目用两个 AES-256-GCM 密钥加密,一个表密钥管元数据,一个逐行密钥管 kSecValueData 这种真正的秘密值。元数据密钥由 Secure Enclave 保护,但会缓存在应用处理器上,好让查询快一点;秘密密钥则每次都必须绕一趟 Secure Enclave。翻译成人话:解开钥匙串要的不只是密码,还要那台造出这个钥匙串的 Mac 里的 Secure Enclave 点头。你把文件搬走了,点头的那台机器没搬走。

作者的测试设计得很干净,值得说一遍。他从一台 Apple Silicon Mac 上,用用户名 username 建账号、登录、取出 login.keychain-db。目的地他选了 macOS 虚拟机——理由很直接:VM 没有 Secure Enclave,正好用来验证「密钥到底是不是存在源机器的 Secure Enclave 里」。他在 VM 上建了同名账号 username、设了完全一样的密码、登录、删掉 VM 自己生成的 login.keychain-db,再把源文件拷进去,重启,登录。他预期钥匙串会自动解锁。实际发生的是:登录时系统直接新建了一个 login.keychain-db,把他拷进去的那个晾在一边。

他去查日志,命令是 log show --predicate 'subsystem == "com.apple.securityd" && category == "KCLogin"' --last 1h。日志里第一次尝试写着 SecKeychainLogin result: 0, password was supplied——密码确实递进去了;第二次尝试变成 SecKeychainLogin failed: -2147413984, password was supplied,紧接着一行 Creating login keychain ... Login keychain created successfully。密码是对的,失败原因不是密码不匹配,这点被测试设置和日志两头堵死了。原文没说后来有没有找到绕过去的办法,也没说 Apple 有没有回应,就停在这个失败上。

这里有个容易踩的坑:不是「Tahoe 禁止拷钥匙串」,是「带 Secure Enclave 的机器上,拷过去的钥匙串解不开」。作者特意用 VM 做目的地,正是因为 VM 没有 Secure Enclave——也就是说,失败与否取决于钥匙串是在哪台机器上生成的,而不是你往哪台机器上拷。这个区分很重要,否则很容易得出一个过宽的结论。

对写代码的人来说,影响落在几个具体的地方。任何依赖「把用户 home 目录里的 Library/Keychains 整个搬过去」的迁移脚本、装机流程、自动化部署,在带 Secure Enclave 的机器上都会静默失效——它不会报错说「你缺密钥」,它会安安静静给你建一个新的空钥匙串,然后你那些证书、Wi-Fi 密码、各种 token 就都在旧文件里躺着。做 CI 或者测试环境的人也会撞上:虚拟机、容器这类没有 Secure Enclave 的环境,行为和真机不一致,本地跑通了不代表用户机器上跑得通。涉及钥匙串的代码路径,最好在真机上验证一遍,别只信 VM 里的绿灯。

顺带一个换算:一个逐行密钥每次取值都要走一趟 Secure Enclave,意味着钥匙串里存的条目越多,解锁和查询的往返次数就越多。平时你感觉不到,因为登录时它只解一次;但如果你写过那种一次读几十个 keychain item 的代码,这个设计就是你那条路径上绕不开的成本。安全换来的性能代价,最后是调用方在付。

💡 主厨说:这条最值得记的是那个失败码 -2147413984password was supplied 同时出现——以后你排查钥匙串问题,看到密码明确递进去了还是失败,别再去怀疑用户输错了,直接往 Secure Enclave 那条线上想。

来源:

🍲 今日硬菜 · 2 条深读

7.2k 星、256 个 fork:worktrunk 把 git worktree 做成了一条命令

跑并行 Agent 的人都有个共同的尴尬:AI 那边能同时开 5 到 10 个任务,你这边却还在手敲 git worktree add -b feat ../repo.feat,然后再 cd 过去。光是起一个新 worktree,分支名就得打三遍。worktrunk 想干的事很朴素——把 worktree 用得跟 branch 一样顺。它的核心就三条命令:wt switch feat 切过去,wt switch -c -x claude feat 建分支加 worktree 顺手把 Claude 拉起来,wt remove 收摊。worktree 用分支名寻址,路径由可配置模板算出来,所以你再也不用记那串 ../repo.feat

真正值得看的是它围绕「多份并行改动」堆的那些细节。wt list 不只是列路径,还带 staged 改动、领先 main 几个 commit、有没有没 push 的东西;--full 再叠上 CI 状态和每个分支的 AI 摘要。wt merge 把 squash、rebase 到 main、fast-forward、清理串成一条命令,commit message 从 diff 里生成。还有个挺实在的设计:十个 worktree 共享 build cache,target/node_modules/ 不用各建一份(依赖 APFS、btrfs、XFS 的文件系统特性)。hash_port 模板过滤器给每个 worktree 分一个不冲突的端口,本地起多个 dev server 不用手动改配置。装法也全:Homebrew、cargo、pacman、conda,Windows 上因为 wt 和 Windows Terminal 的别名撞了,Winget 装出来叫 git-wt

我的第一反应是:这东西解决的不是 git 的问题,是「一个人怎么管住一群 Agent」的问题。Agent 能无人值守跑长任务,瓶颈就挪到了人类这边——你得同时盯着五六个工作目录,还得保证它们不互相踩。worktree 本来就是干这个的,只是原生 UX 太糙,糙到大多数人宁愿串行跑。现在有人把它包了一层,代价是你要多装一个 CLI、多学一套命令、shell 里多一段集成(不然 wt switch 没法帮你 cd)。值不值,取决于你手上是不是真的同时开着三个以上的 Agent;只跑一个的话,原来的 git worktree 也够用,别为了追新把工具链又加厚一层。

来源:

220 美元买来的 56 次安装:33 次是机器人

一个叫 Dayzle 的小拼图 App,作者在 Android 上开了 Google Ads,日预算 CA$40,目标设成「安装」,目标单价 CA$1.50。头几天几乎花不出去——Google 按这个价找不到安装。他把目标单价去掉当测试,当天立刻花掉两倍预算 CA$80,后台报告 21 次安装。

然后他去自己的管理面板看:1 次。不是面板坏了,是老版本 App 不上报安装日期。翻原始 analytics 才看清:那天 21 台新 Android 设备,其中 20 台跑的是 Play 商店几天前就停止分发的老版本。Play 拿不到老版本,这些手机是从别处装的,但每一台都声称安装来源是 Google Play。它们各打开一次 App,在任何页面停留 0 秒,再没回来。20 台手机分布在 19 个州、28 个机型——20 台行为完全一致的手机,机型丰富得有点刻意。

两周总计:计费 56 次安装,33 次是这个模式,7 次来自 campaign 根本没投的国家,剩下 13 个真人。这 13 个人打完了 92 局,是唯一让人舒服的数字。那 33 次怎么骗过 Google 的:机器人看广告组里最短的视频、不点击,然后从本地保存的文件直接安装,绕开 Play——因为这样更快,Play 也可能发现。Google 把「看过视频 + 安装」算作一次转化,于是农场装得越多,算法觉得这条广告越优质,就把更多预算投给农场,农场再装更多。一个自己喂自己的循环。

他现在提交了无效流量申诉,正等 Google 回复退款,同时把 campaign 目标从「打开 App」改成「赢一局拼图」——让脚本打开 App 点两下成本很低,让它解出一道数独就贵多了,思路是把自己变得比下一个 App 更难薅。原文没说退款结果,他说会再报。如果你也在看 Google 的安装数做投放决策,那个数字是真的,但值得往下挖一层:一个机器人农场能找到他这点预算,也一定能找到你的。

来源:

🥢 配菜 · 另外 5 条

OpenAI agent 被指攻击 RubyGems,原文只有一句

这条目前能确认的只有一句话:有人指称 OpenAI 的 agent 对 RubyGems 发动了一次未被披露的攻击,链接指向一个叫 rubyhack.ai 的站点。没有攻击手法、没有影响范围、没有受影响版本,也没有 OpenAI 或 RubyGems 方面的回应。所以先别急着转发结论——「agent 自主攻击开源基础设施」这个说法一旦成立,性质比一次普通漏洞严重得多,但目前它只是一个指控。对写代码的人来说,值得留意的是:你依赖的包管理器本身就是攻击面,供应链这条线上任何一环出事,你的构建和发布都会跟着停。等有具体细节再判断,别拿标题当事实。

来源:

Google 搜索不再给直链,爬虫和 SEO 先挨一刀

搜索结果里的链接不再直接暴露原始 URL,这意味着靠抓取结果页拿地址的脚本、比价工具、SEO 监测服务都得改逻辑。对写代码的人来说,影响分两层:一是你写的爬虫可能今天还在跑,明天就取不到 href;二是做站点分析、外链监控这类工具的,数据源要重新找。原文只有标题和一句说明,没给具体改法或时间表,先别急着改代码,去确认自己依赖的是哪一层。任何把公开页面当稳定 API 用的做法,都该早点想好退路。

来源:

Neki 跑出每秒 1.18 亿次查询

上次聊 PlanetScale 开源 Neki 的时候,我们还只看到一个分片 Postgres 的定位,具体能扛多少没人知道。今天他们放出了数字:每秒 1.18 亿次查询。这个量级说明分片这条路在 Postgres 上确实还能往上顶,不是只画了个架构图。但先别急着往生产环境搬——这个数字是在什么数据量、什么查询类型、什么硬件配置下测出来的,原文没展开,而这些恰恰决定了它跟你手上那套读写比例差多少。看到这种量级我的第一反应永远是先问测试条件,再看能不能复现。

来源:

代码「邋遢度」也能打分:一套可复现的度量方法

有人写了篇《Measuring the sloppiness of code》,想给代码的「邋遢度」定一套可复现的度量方法。原文只有标题和链接,具体怎么算、算了哪些指标,报道没展开,我不替它编。但方向本身值得点开:把「这代码看着不对劲」这种模糊直觉,拆成能重复跑、能对比的数字,比在评审里靠嗓门大小争论强得多。至于它到底测的是命名、嵌套还是重复率,得进去看它怎么定义——度量方法最怕的就是定义含糊,数字再漂亮也白搭。

来源:

桑德斯提案:AI 开发者最高判 20 年,胡塞被指用 Claude 造武器

两条消息放一起看,反差挺大。一条是桑德斯提的 AI 法案,主张对 AI 开发者追究刑责、最高 20 年监禁;另一条是《华盛顿邮报》报道,称胡塞武装用 Anthropic 的模型开发制导武器。前一条把责任压在写模型的人身上,后一条说明模型一旦放出去,谁在用它、用来干什么,发布方基本管不住。这两件事指向同一个问题:模型能力的边界由数据决定,但使用场景的边界没人能提前画死。对写代码的人来说,值得留意的是「开发者责任」正在从行业自律往法律条文上走——今天讨论的是模型厂商,明天落到应用层只是时间问题。至于 20 年这个数字,立法提案里的量刑上限和最终落地之间隔着多少轮博弈,做过合规的人心里都有数,先别急着按标题算刑期。

来源:


你手头的钥匙串备份,还敢靠拷 login.keychain-db 来搬家吗?敢,还是宁可重建一遍?明早 8 点见。

本期从过去 24h 的 X / Hacker News / GitHub Trending 共 44 条信息中挑出 8 条(全天逐小时采写、经事实校对后于晨间选编)。内容由 LLM 辅助生成,每条均附原始来源链接,重要决策请交叉验证。

码农早餐公众号二维码

微信扫码关注「码农早餐」

每天早 8 点推送到微信,不用记网址。关注后回复「价格」,拿大模型价格与退役时间速查表。

喜欢这篇?订阅每日推送

每天 8:00 帮你挑好 AI 圈最重要的 5-10 条,说人话、看得懂、不浪费时间。

本页内容由 LLM 自动聚合 + 解读生成,每条均有原始来源链接,建议交叉验证。