# SAML 内部揭秘：信件里的签名

Published: 2026-09-24

SAML 让你登录几乎所有工作应用，其签名存在于它签名的 XML 内部。深入探讨：应用、浏览器和身份提供商之间的登录流程，断言的样子，为什么规范化必须在每个字节上达成一致，以及为什么相同的错误类别从 2012 年到 2025 年不断重现。受 Trail of Bits 的“SAML：糟糕设计的碎片” (在 Hacker News 上获得 312 分) 启发。

Canonical: https://thedailydiff.dev/zh-CN/video/2026-09-24-saml-under-the-hood/

## 本视频涵盖的内容

- SAML：从内部签名自身的登录方式
- 2002 年：四种 XML 格式，一个委员会，一个完整行业
- 登录流程：应用 → 身份提供商 → 通过浏览器返回
- 断言：签名存在于它签名的内容内部
- 规范化：在每个字节上达成一致，否则无人能登录

## 章节

- 0:00 SAML：从内部签名自身的登录方式
- 0:34 2002 年：四种 XML 格式，一个委员会，一个完整行业
- 0:46 登录流程：应用 → 身份提供商 → 通过浏览器返回
- 0:59 断言：签名存在于它签名的内容内部
- 1:10 规范化：在每个字节上达成一致，否则无人能登录
- 1:32 2012 年：检查者和读取者查看不同元素
- 1:51 2018 年和 2025 年：两个解析器，两个不同的答案
- 2:08 为何它持续出现问题：糟糕设计的碎片
- 2:27 周一：OIDC 优先，一个维护良好的库，严格的形状
- 2:43 内部揭秘：REVERT

## 翻译的文字记录

译自英文原版旁白。可用音频和字幕由 YouTube 控制。

### SAML：从内部签名自身的登录方式

0:00 SAML 是让你登录几乎所有工作应用的 XML， 它的签名存在于它签名的文档内部， 就像公证员将印章钉在他正在密封的信封内部。 在一个委员会编写它十年后，研究人员测试了十四个 SAML 框架。十一个失败了。 而本周，Trail of Bits 发表了一篇文章，称其为糟糕设计的碎片，登上了 Hacker News 的首页。 三分钟内：登录流程如何工作，签名隐藏在哪里，

0:27 以及为什么大家一致同意的解决方案是不同的协议。 这是 The Daily Diff 的内部揭秘。

### 2002 年：四种 XML 格式，一个委员会，一个完整行业

0:34 2002 年。 Oasis 的一个安全委员会将四种供应商 XML 格式合并为一种。 大学首先采用它，然后 Okta 在此基础上建立了一家公司， 这是一个委员会文档转化为收入最快的一次。 你打开应用。

### 登录流程：应用 → 身份提供商 → 通过浏览器返回

0:46 它不知道你是谁，所以它将你的浏览器跳转到身份提供商， 例如你公司的 Okta。 你在那里登录。 Okta 将一个签名的 XML 文档交给你的浏览器，说明你是谁， 然后浏览器将其回传。

### 断言：签名存在于它签名的内容内部

0:59 该文档就是断言。 它命名了用户，签名位于其内部， 通过其 ID 指向断言本身。 整个过程通过你的浏览器进行，也就是说， 通过用户进行。 为了检查它，应用

### 规范化：在每个字节上达成一致，否则无人能登录

1:11 重建了被签名的精确字节。 它将签名剪切出来，标准化空白和属性 顺序，并对结果进行哈希。 这就是规范化，如果双方在单个字节上不一致， 就没有人能登录。 JSON Web Token 的做法不同。 头部、负载和签名并排排列，中间有圆点。 无需先剪切任何内容。

### 2012 年：检查者和读取者查看不同元素

1:32 这就是症结所在。 检查签名的代码和读取用户名的代码 通常是两个不同的部分。 在 2012 年，一篇名为《On Breaking SAML》的论文展示了你可以将 签名的断言移动到读取者忽略的位置，并在其 查看的位置放置第二个断言。Salesforce 和 Shibboleth 是失败的十一个之一。 在 2018 年，Duo 展示了用户名内部的注释可能导致某些

### 2018 年和 2025 年：两个解析器，两个不同的答案

1:55 库只读取一半的名称，而签名仍然通过检查。 在 2025 年，GitHub 发现 Ruby SAML 内部的两个 XML 解析器 在同一文档上存在分歧。 相同的 Bug，新的十年。 Trail of Bits 称其为碎片，因为你缩放的每个级别都存在

### 为何它持续出现问题：糟糕设计的碎片

2:12 相同的缺陷。它基于 XML，签名是封装的， 而实际的登录可能只使用了规范的十分之一。 Hacker News 上的最高回复来自购买者。 如果你没有 SAML 支持，我可以找到一个有支持的产品。 两者都正确，这就是问题所在。 所以，周一。首先 SHIP IT OpenID Connect，Fly 和 Tailscale 将产品销售给

### 周一：OIDC 优先，一个维护良好的库，严格的形状

2:31 完全没有 SAML 的企业。 如果客户强制要求，使用维护良好的库，保持打补丁， 并拒绝那些看起来不像 Okta 或 Google 发送的消息。 切勿编写自己的签名检查。

### 内部揭秘：REVERT

2:43 内部揭秘：NEEDS REVIEW。 REVERT。将近二十五年了，一个永不消亡的 Bug 类别， 而大家一致同意的解决方案是不同的协议。 上周六我拆解了通行密钥，所以请在评论中告诉我接下来要揭示什么。 这就是今天的 The Daily Diff。 我是 Axrisi 的 Niko。 负责任地合并。

## 来源

- [Trail of Bits, "SAML: A fractal of bad design" (Matt Schwager, Sep 21, 2026)](https://blog.trailofbits.com/2026/09/21/saml-a-fractal-of-bad-design/) — blog.trailofbits.com
- [Hacker News thread](https://news.ycombinator.com/item?id=49806335) — news.ycombinator.com
- [Somorovsky et al., "On Breaking SAML: Be Whoever You Want to Be", USENIX Security 2012](https://www.usenix.org/conference/usenixsecurity12/technical-sessions/presentation/somorovsky) — www.usenix.org
- [Duo Labs, SAML vulnerabilities affecting multiple implementations (2018): https://duo.com/blog/duo-finds-saml-vulnerabilities-affecting-multiple-implementations · CERT VU#475445](https://www.kb.cert.org/vuls/id/475445) — www.kb.cert.org
- [GitHub Security Lab, "Sign in as anyone: Bypassing SAML SSO authentication with parser differentials" (Mar 12, 2025)](https://github.blog/security/sign-in-as-anyone-bypassing-saml-sso-authentication-with-parser-differentials/) — github.blog
