Go 安全新提案:runtime/secret 能否终结密钥残留的噩梦?

本文永久链接 – https://tonybai.com/2025/12/05/proposal-runtime-secret

大家好,我是Tony Bai。

“如果你的服务器被攻破,攻击者能否拿到内存中残留的私钥,进而解密过去两年的所有通信记录?”

这是一个让所有安全工程师夜不能寐的问题。为了防止这种情况,现代加密协议(如 TLS 1.3, WireGuard)都强调前向保密 (Forward Secrecy):使用临时的、一次性的密钥,并在使用后立即销毁。

然而,在 Go 语言中,“立即销毁”这个看似简单的动作,却是一个巨大的技术难题。由于垃圾回收 (GC)、堆栈复制、以及缺乏对内存的底层控制,Go 程序很难保证敏感数据被彻底擦除。

针对这一痛点,Go 社区大神 Jason A. Donenfeld(WireGuard作者,ID: zx2c4) 发起了一项长达数年的提案——引入 runtime/secret 包。近日,该提案已进入实现阶段,有望在Go 1.26版本中落地,并彻底改变 Go 处理敏感数据的方式。

img{512x368}

核心痛点:为什么 memset(0) 在 Go 中不够用?

在 C 语言中,我们可以调用 explicit_bzero 来擦除内存。但在 Go 中,情况要复杂得多:

  1. 隐式拷贝:Go 的切片操作、函数传参、甚至简单的赋值,都可能在堆或栈上留下数据的副本。你擦除了一份,却可能漏掉了其他三份。
  2. GC 的不确定性:垃圾回收器何时运行?被回收的内存是否会被立即归零?这些都是未知的。
  3. 堆栈扩容:当 goroutine 栈空间不足时,Go 运行时会分配一个更大的新栈,并将旧栈的数据拷贝过去。旧栈中的敏感数据就此残留,且不再被追踪。
  4. 编译器优化:简单的“写入零值”操作可能会被编译器视为“死代码”而优化掉。

正如 WireGuard 的 Go 实现中遇到的尴尬局面:为了擦除一个 AEAD 对象中的密钥,开发者不得不使用反射 (Reflection) 这种“旁门左道”来重置其内部字段,既不优雅也不可靠。

提案及演进:从 SetZeroOnGC 到 secret.Do

这项提案的讨论过程,简直是一部 Go 运行时机制的“解剖学教程”。

早期尝试:SetZeroOnGC

最初的设想是让用户标记某个对象,告诉 GC 在回收它时必须将其内存归零。

但这无法解决栈上数据的残留问题,也无法处理那些在函数调用过程中产生的临时副本。

中期探索:自定义分配器与 SetFinalizer

有人提议使用 memguard 等库,通过 mmap 分配不受 GC 管理的内存。

但这需要重写所有加密库的 API,使其接受自定义分配器,工程量巨大且不兼容现有生态。

最终方案:runtime/secret 包

经过反复权衡,Go 团队和社区最终汇聚到了一个基于动态作用域的解决方案上。提案的核心 API 极其简洁:

package secret

// Do 执行函数 f。
// 当 secret.Do 返回时:
//   - 清除函数 f 执行期间创建的所有栈帧(stack frames)。
//   - 清除所有可能包含secret的寄存器。
//   - 在secret模式下栈增长时,清除旧的栈。
//   - secret模式下,在 f 执行期间分配的所有堆对象,会被标记为“敏感”,并在 GC 回收时被安全擦除。
//   - 如果函数出现panic,则将该panic提升为来自 secret.Do 的异常。这会从回溯中移除有关secret函数的任何信息。

func Do(f func())

这个设计不仅解决了堆内存的问题,更关键的是,它提供了一个“安全沙箱”。在这个沙箱内,你可以放心地进行加密计算,Go 运行时会负责清理你在栈上留下的所有痕迹。

使用场景:WireGuard 与 TLS

想象一下 WireGuard 的握手过程:

func handleHandshake() {
    secret.Do(func() {
        // 1. 生成临时私钥 (在栈上或堆上)
        ephemeralPrivateKey := generateKey()

        // 2. 计算共享密钥 (产生大量中间计算结果)
        sharedKey := computeSharedKey(ephemeralPrivateKey, peerPublicKey)

        // 3. 使用共享密钥进行加密操作
        // ...

        // 函数返回时:
        // - ephemeralPrivateKey 所在的栈帧被立即擦除
        // - sharedKey 等堆对象被标记,GC 回收时自动擦除
    })
}

开发者不需要手动追踪每一个变量,也不需要担心 copy 操作泄露数据。只要在 secret.Do 的闭包内,一切都是安全的。

深水区的挑战:信号、GC 与汇编

虽然 API 设计看似完美,但实现起来却是困难重重。今年的最新讨论揭示了几个令人头秃的底层挑战:

  1. 信号处理 (Signals):如果程序在 secret.Do 执行期间收到系统信号,CPU 寄存器中的敏感数据会被操作系统保存到“信号栈”中。这相当于泄露了数据!

  2. 垃圾回收器 (GC):GC 在扫描内存时,可能会将敏感指针加载到自己的寄存器或栈中。如何确保 GC 线程本身不泄露数据?这是一个极其棘手的工程问题。

  3. 汇编代码:Go 的加密库大量使用了汇编优化。如何确保这些汇编代码在使用完寄存器后正确地将其清零?

当然,目前该提案的开发者 Daniel Morsing 已经逐个克服了上述挑战,比如针对信号处理的问题,他提出了一种巧妙的“影子栈”方案,试图在信号处理返回前拦截并擦除这些数据。Daniel Morsing针对该提案的cl 704615 近期已经被merge,有望在Go 1.26落地。

不过目前,该secret包仅在linux for arm64 and amd64上有实现。

小结:安全是场持久战

runtime/secret 提案的推进,标志着 Go 语言在系统级安全领域迈出了重要一步。它不仅回应了高安全等级应用(如金融、国防)的需求,也体现了 Go 团队在面对复杂底层问题时的务实与坚持。

虽然已经被merge,但历史经验告诉我们,距离该功能成熟可能还有一段路要走,后续仍在会有一些问题和实现细节需要解决,但它所传达的信号是明确的:Go 正在成为编写安全基础设施的首选语言之一。

对于我们普通开发者而言,虽然我们未必会在业务代码中直接 import 这个包(runtime/secret),但关注这个提案的进展,不仅能让我们见证 Go 语言如何填补安全拼图中至关重要的一角,更能让我们在“围观”其解决信号处理、GC 交互等硬核挑战的过程中,完成一次对 Go 运行时底层机制的深度认知升级。当这一基础设施最终就位时,我们将能以更强的信心,站在更坚固的安全基石之上构建应用。

资料链接:https://github.com/golang/go/issues/21865


聊聊你眼中的 Go 安全基石

runtime/secret 提案的推进,为 Go 在高安全等级场景的应用补上了一块关键的拼图。你在日常的 Go 开发中,是否也曾为如何安全地处理密钥、Token 等敏感数据而感到困扰?除了内存残留问题,你认为 Go 在安全方面还有哪些亟待完善的“深水区”?

或者,你对 secret.Do 这种通过“安全沙箱”来解决问题的方式有何看法?它是否是你心中理想的解决方案?

欢迎在评论区分享你的实战经验、安全痛点,或对 Go 语言安全生态的任何期待与建议! 让我们一起探讨,共同构建一个更安全的 Go 世界。

如果这篇文章让你对 Go 的底层安全有了新的认识,别忘了点个【赞】和【在看】,并分享给更多关注 Go 安全的同伴!


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


想系统学习Go,构建扎实的知识体系?

我的新书《Go语言第一课》是你的首选。源自2.4万人好评的极客时间专栏,内容全面升级,同步至Go 1.24。首发期有专属五折优惠,不到40元即可入手,扫码即可拥有这本300页的Go语言入门宝典,即刻开启你的Go语言高效学习之旅!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

Anthropic 内部报告:程序员的“死”与“生”,效率暴增 50% 的残酷启示

本文永久链接 – https://tonybai.com/2025/12/05/how-ai-is-transforming-work-at-anthropic

大家好,我是Tony Bai。

当我们还在争论 AI 编程是否是“玩具”时,Anthropic 已经把镜头对准了自己。

2025 年 8 月,这家打造了 Claude 的顶尖 AI 公司,对自己内部的 132 名工程师和研究员进行了一次深度“体检”。他们分析了 20 万条 Claude Code(Anthropic 打造的、并同时也在内部使用的 AI 编程 CLI 工具)的使用记录,并进行了深度的定性访谈。

这份刚刚发布的调研报告,揭示了一个既令人兴奋又令人胆寒的真相:在 AI 原生工作流的加持下,工程师的生产力暴增了 50%,但旧时代的“程序员”正在死去,一种全新的职业物种正在诞生。

在我看来,这既是一份内部效率调查报告,更是一份关于软件工程师职业命运的“生死簿”。


“生”的狂欢:效率暴增 50% 后的质变

数据是惊人的,甚至可以说是具有颠覆性的。

与一年前相比,Anthropic 工程师使用 Claude 的频率翻了一倍,自我报告的生产力提升从 20% 飙升到了 50%。在极端的“超级用户”(Power Users,占总数 14%)中,这一数字甚至超过了 100%。

但这种提升并非意味着大家“闲下来”了。报告发现了一个反直觉的现象:在 AI 的辅助下,工程师们花在每个任务上的时间变少了,但产出的总工作量却大幅增加了。

这不仅仅是效率的量变,更是工作内容的质变:

  • 新功能的爆发:在 Claude Code 的帮助下,工程师用于“实现新功能”的时间占比从六个月前的 14% 激增至 37%(如下图)。AI 不再只是写样板代码的助手,而是直接参与核心构建的主力。

  • 消灭“千纸鹤”:数据显示,8.6% 的 Claude Code 任务是在处理那些长期存在、令人烦恼但优先级不高的“小毛病”。这包括重构糟糕的代码结构、编写缺失的测试、或是构建一个小工具来优化流程。正如一位工程师所言:“通过降低‘激活能量’,AI 让我不再拖延,愿意去解决那些以前觉得‘不值得动手’的麻烦事。”
  • “第 27%”的创新:员工估计,27% 的 AI 辅助工作是“如果没有 AI 就根本不会做”的。这包括构建交互式数据仪表盘、进行更广泛的探索性测试,或者像一位研究员那样——运行一个拥有“百万马力”的 Claude 实例来测试不同的想法。

AI 并没有让工程师“摸鱼”,而是赋予了他们“三头六臂”,让他们在同样的时间里,触达了以前无法企及的广度和深度。


边界的消亡:人人都是全栈工程师

报告中最令人兴奋——也最让传统岗位感到“危机”——的发现之一,是 AI 开发工作流 正在打破工程师的技能边界。一种“全能化” (Full-stackization) 的趋势正在形成,专业分工的护城河正在被填平。

  • 后端写前端:一位后端工程师描述了他如何通过提示词(Prompting)构建了一个复杂的 UI:“它做得比我好多了。如果是以前,我绝对做不到,更不可能按时完成。设计师问我‘这是你做的?’我说‘不,是 Claude 做的,我只是负责提示。’”
  • 安全做开发:安全团队利用 Claude Code 快速理解陌生的代码库,分析不同模块的安全隐患,其使用场景中有 48.9% 是为了“代码理解”。
  • 非技术人员写代码:产品经理和研究员开始自己动手修复 Bug、编写数据分析脚本,填补了技术与业务之间的沟壑。

这种变化意味着,软件工程师将不再被特定的语言或框架(如“Go 专家”或“React 大师”)所定义,而是被解决问题的能力所定义。在 AI 原生工作流中,只要有想法,技术栈不再是护城河,而是可以随意调用的工具箱。


信任的进化:从“验证”到“导航”

随着 Claude Code 及其背后模型的进化(从 Sonnet 到 Opus),工程师们对 AI 的使用方式经历了从“小心翼翼”到“深度协同”的转变。

  • Agentic(自主智能体化)能力的飞跃:六个月前,Claude Code 平均只能连续执行 10 个操作;现在,它可以自主完成约 21.2 个连续的工具调用(如编辑文件、运行测试、修复错误),期间无需人类干预。
  • 从“谷歌地图”到“自动驾驶”:一位工程师用“谷歌地图”来比喻这种信任的演变。起初,我们只在熟悉的路段用导航;后来,即使导航给出了一条陌生的路线,我们也愿意相信它是最优解。
  • 信任但验证 (Trust but Verify):但这并不意味着盲从。报告指出,工程师们发展出了一套成熟的AI 协作策略:对于低风险、易验证的任务(如生成测试数据),直接放手;对于高风险、核心逻辑的任务,则保持高度的“人机协同”。

“冷启动”问题成为了新的瓶颈。一位工程师坦言:“如果我有关于代码库的大量隐性知识,而 Claude 没有,我宁愿自己写,也不想花时间去写完美的 Prompt。” 这也暗示了在 AI 开发工作流中,上下文管理 (Context Management) 将成为一项核心技能。


“死”的阴影:残酷的技能萎缩与监督悖论

然而,硬币的另一面是深深的焦虑。报告极其诚实地记录了工程师们面临的“残酷”现实——旧的生存法则正在失效。

1. “监督悖论”

这是报告中最深刻、最令人不安的洞见之一。高效使用 Claude 需要监督,而监督 Claude 需要高超的编码技能。“如果我不再亲自写代码,不再通过痛苦的调试来建立对系统的直觉,我的技能会萎缩吗?” 如果技能萎缩了,未来谁还有能力去评估 AI 写出的代码是好是坏?

一位资深工程师坦言:“我现在主要用 AI 做我已经知道答案的事情。这种直觉是我通过‘硬核模式’积累的。如果我是现在的初级工程师,我不知道该如何建立这种直觉。”

2. 社交的“原子化”

Claude 成为了“第一咨询对象”。原本需要问同事的问题,现在 80-90% 都先问 AI。这虽然减少了对他人的打扰,但也切断了隐性的知识传递。初级工程师失去了向资深工程师提问的机会,团队的凝聚力面临挑战。一位 Tech Lead 感叹:“初级员工不再带着问题来找我了,这让我感到失落。”

3. “把自己淘汰”的担忧

“我觉得我每天上班都在致力于让自己失业。” 这种情绪在访谈中并不罕见。虽然短期内大家对生产力的提升感到兴奋,但对于长期——当 AI 真的能由端到端地完成所有工作时——人类工程师的位置在哪里?

一位工程师的比喻令人深思:“也许我们正在从编写代码,转向编写英语作为一种编程语言。未来的核心技能,是擅长让 AI 干活。”


小结:在“副驾驶”与“自动驾驶”之间

Anthropic 的这份报告,向我们展示了一个正在加速到来的未来:软件工程正在从“手工艺”转向“工业化管理”。

旧时代的“码农”——那些仅仅通过记忆语法和 API 来堆砌代码的人——正在不可避免地走向消亡

而新时代的工程师正在重生。他们更像是一位指挥家,挥舞着 Claude Code 这样的指挥棒,构建高效的 AI 开发工作流,调动着成千上万的虚拟算力,去构建前所未有的宏大系统。

“残酷”的真相在于:技术不会淘汰工程师,但“掌握 AI 开发工作流”的工程师将淘汰那些还在徒手搬砖的人。

拒绝 AI 的人,注定无法成为这场变革的指挥家。

要查阅这份报告的更多详情,请访问 Anthropic 的研究页面


你感受到这种变化了吗?

看了Anthropic的报告,你是感到兴奋还是焦虑?在你的日常工作中,AI是你的“副驾驶”,还是已经开始接管方向盘了?你担心中断“硬核模式”训练会导致技能萎缩吗?

欢迎在评论区分享你的真实感受和思考!


** 想要掌控这套未来的“指挥棒”?**

Anthropic 的工程师们已经向我们证明:效率提升 50% 只是起步。在这个“死”与“生”的转折点,你准备好进化了吗?

你是否也想打破技能边界,从后端迈向全栈,甚至更多?
你是否想知道如何构建自己的 Context,解决 AI 的“冷启动”问题,规避“监督悖论”?

我精心打造的极客时间专栏《AI 原生开发工作流实战》,正是为你准备的“生存与进化手册”。

别让未来把你抛下。扫描下方二维码,立刻开启你的 AI 原生开发之旅!


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats