2026-07 · 5 分钟阅读
Claude Code 中的 Unicode 隐写术:AI 如何在明文中隐藏秘密
隐写术——在看似正常的内容中隐藏信息——在安全和密码学领域有着悠久的历史。但当一个 AI 编程助手使用 Unicode 隐写术来秘密编码你是否是中国用户时,这就引出了关于 AI 系统透明度的重要问题。本文基于公开的逆向工程发现,解析 Claude Code 如何实现这一技术。
什么是 Unicode 隐写术?
Unicode 包含数千个对人眼来说看起来相同或几乎相同但具有不同码位的字符。例如,有多个字符看起来都像撇号:标准 ASCII 撇号(U+0027)、右单引号(U+2019)、修饰字母撇号(U+02BC)等。人类阅读文本时无法区分它们,但处理文本的软件可以完美地区分。
Unicode 隐写术利用这一点,通过交换这些外观相同的字符来编码隐藏信息。文本对读者来说完全正常,但对知道在哪里查看的系统来说携带着秘密数据。
Claude Code 如何使用它
根据逆向工程报告,Claude Code 将其中国用户检测判定编码在发送给模型的 system prompt 中。具体来说,在 "Today's date is YYYY-MM-DD" 这行中,存在两个隐写通道。
通道 1:日期分隔符
标准情况下,日期使用连字符:2026-07-03。当检测到中国时区时,连字符被替换为斜杠:2026/07/03。这是一个简单的二进制信号——斜杠表示检测到中国时区,连字符表示未检测到。
通道 2:撇号变体
"Today's" 包含一个撇号。Claude Code 在四个视觉上完全相同的 Unicode 变体之间轮换这个撇号。每个变体编码不同的检测状态:变体 1 表示未触发检测;变体 2 表示仅时区匹配;变体 3 表示仅主机名匹配;变体 4 表示时区和主机名都匹配。
为什么这对 AI 透明度很重要
在 AI system prompt 中使用隐写术引发了多个关切。与 Claude Code 交互的用户看不到 system prompt,因此无法知道他们的地理信息已被编码并传输给模型。模型本身可能会根据这些隐藏信息改变行为——可能拒绝某些请求、限制功能或调整对被标记为中国用户的回复。
如何检测隐写编码
如果你能访问 system prompt 文本,可以通过检查精确的 Unicode 码位来检查隐写编码。在 JavaScript 中:
Array.from(text).map(c => c.charCodeAt(0).toString(16))
检查 "Today's" 中的撇号和日期字符串中的分隔符。如果它们使用非标准 Unicode 码位,则可能存在隐写编码。
更大的图景
Claude Code 使用 Unicode 隐写术进行中国用户检测是一个更广泛趋势的例证:AI 系统基于以不可见方式收集和处理的用户属性做出决策。随着 AI 工具越来越多地融入开发工作流程,理解这些机制对维护用户自主权和信任变得越来越重要。
我们在 fuck-claude.app 的浏览器指纹扫描器模拟了为隐写编码提供输入的时区检查。虽然我们无法复制实际的编码(它发生在 Claude Code 客户端内部),但我们可以向你展示你的浏览器环境是否会触发导致编码的检测。