惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

土法炼钢兴趣小组的算法知识备份

国密算法与国密 TLS 系列索引 【系统架构设计】架构质量属性:不只是"高可用高性能" 【系统架构设计百科】告警策略:如何避免"狼来了" 【系统架构设计】CQRS:读写分离的架构哲学 【系统架构设计】空间架构:极端扩展场景的解法 【系统架构设计】微服务架构深度审视:优势、代价与适用边界 【系统架构设计】扩展性原理:水平、垂直与对角扩展 【系统架构设计】无状态设计:扩展的第一步也是最难的一步 【系统架构设计】缓存架构:从本地到分布式的多级缓存体系 【系统架构设计】管道与过滤器:Unix 哲学的架构表达 【系统架构设计】复杂性管理:架构的核心战场 【系统架构设计】消息队列架构:异步解耦的设计与陷阱 【系统架构设计】CDN 架构:全球加速的设计原理 【系统架构设计】连接池设计:被忽视的性能杀手 【系统架构设计】弹性设计模式:熔断器、舱壁与超时 【系统架构设计】高可用设计模式:冗余、故障转移与仲裁 【系统架构设计】容量规划:从拍脑袋到数据驱动 【系统架构设计】数据库扩展:分库分表的工程实践与替代方案 【系统架构设计】SLO 工程:可靠性的量化管理 【系统架构设计】性能建模:用数学思维分析系统瓶颈 【系统架构设计】混沌工程:主动验证系统的韧性 【系统架构设计】零拷贝与内存映射:数据搬运的极致优化 【系统架构设计】线程模型:从 thread-per-request 到协程 【系统架构设计】容灾架构:多活与灾备设计 【系统架构设计】数据库性能模式:索引、查询与连接管理 【系统架构设计】数据建模:从关系范式到文档模型的真实权衡 【系统架构设计】吞吐量优化:批处理、流水线与并发模型 【系统架构设计】流处理架构:从批处理到实时的范式迁移 【系统架构设计】搜索引擎架构:倒排索引之上的系统设计 【系统架构设计】时序数据架构:监控与 IoT 的存储设计 【系统架构设计】数据迁移与版本化:在线不停机的数据演进 【系统架构设计】数据湖与数据仓库:分析架构的演进路线 【系统架构设计】API 网关设计:入口层的职责边界 【系统架构设计】应用层数据一致性模式:在正确性与性能之间走钢丝 【系统架构设计】多模数据库选型:Polyglot Persistence 的工程实践 【系统架构设计】服务发现与注册:动态拓扑的基础设施 【系统架构设计】配置管理架构:从配置文件到配置中心 【系统架构设计】全链路压测:大规模系统的性能验证 【系统架构设计】幂等性设计:分布式环境下的安全重试 【系统架构设计】契约测试与 Schema 演进:服务间的信任协议 【系统架构设计】长连接与推送架构:WebSocket、SSE 与 MQTT 【系统架构设计】延迟分析:从 P50 到 P999 的全链路追踪 【系统架构设计百科】DDD 战术模式:聚合、实体与值对象 【系统架构设计百科】防腐层与开放主机服务:系统集成的 DDD 方案 【系统架构设计百科】领域事件与事件风暴:从业务到架构的桥梁 【系统架构设计百科】CQRS + Event Sourcing 完整实战:从领域建模到部署 【系统架构设计百科】DDD 与微服务:用领域模型划分服务边界 【系统架构设计】DDD 战略设计:限界上下文与上下文映射 【系统架构设计百科】认证架构:从 Session 到 JWT 到 OIDC 【系统架构设计】API 设计哲学:REST vs GraphQL vs gRPC 的真实权衡 排序算法专题:从 TimSort 到并行排序 【密码学百科】国密算法体系:SM2/SM3/SM4/SM9 全景解读 【密码学百科】承诺方案:Pedersen 承诺、向量承诺与多项式承诺 【密码学百科】不经意传输与隐私信息检索:OT、OT 扩展与 PIR 【密码学百科】门限密码学:门限签名、门限解密与分布式密钥生成 完美哈希:从理论到 gperf 实践 【密码学百科】安全多方计算:从 Yao 的混淆电路到实用 MPC 【密码学百科】同态加密:从 Paillier 到全同态加密(FHE) 【密码学百科】零知识证明系统:zk-SNARKs、zk-STARKs 与 Bulletproofs 【密码学百科】概率论与密码分析:生日攻击、差分分析与线性分析 【密码学百科】计算复杂性与归约:密码安全性证明的基石 【密码学百科】秘密共享:Shamir 方案、VSS 与安全多方计算入口 【密码学百科】椭圆曲线代数:Weierstrass 方程、点群运算与曲线选择 【密码学百科】离散对数与配对密码学:从 DLP 到 BLS 签名 【密码学百科】格密码数学基础:SVP、LWE 与格基约化 【密码学百科】抽象代数:群、环、域的密码学视角 【密码学百科】有限域算术:GF(2^n) 运算与在 AES/ECC 中的应用 【密码学百科】数论进阶:二次剩余、椭圆曲线上的 Weil 配对 【密码学百科】密码学简史:从凯撒密码到量子时代 【密码学百科】威胁模型与安全目标:CIA 三要素之外 【密码学百科】Kerckhoffs 原则与现代密码设计哲学 【密码学百科】随机性:密码学的基石 【密码学百科】信息论入门:熵、完美保密与 Shannon 定理 【密码学百科】分组密码原理:Feistel 网络与 SPN 结构 【密码学百科】AES 逐步拆解:SubBytes 到 MixColumns 的数学 【密码学百科】分组密码工作模式全览:ECB/CBC/CTR/OFB/CFB 【密码学百科】流密码:RC4 的兴衰与 ChaCha20 的崛起 【密码学百科】密码学哈希函数:MD5→SHA-2→SHA-3 的进化之路 【密码学百科】MAC 与 HMAC:消息认证的正确姿势 【密码学百科】认证加密(AEAD):GCM、ChaCha20-Poly1305 与 OCB 【密码学百科】密钥派生函数:HKDF、PBKDF2、Argon2 与密码存储 【密码学百科】公钥密码的数论基础:模运算、群、原根 【密码学百科】RSA 从原理到攻击:教科书 RSA 为什么不安全 【密码学百科】Diffie-Hellman 密钥交换与离散对数问题 【密码学百科】椭圆曲线密码学(ECC):从几何直觉到点群运算 【密码学百科】数字签名:ECDSA、EdDSA 与 Schnorr 签名 【密码学百科】现代密钥交换:X25519、ECDHE 与前向保密 【密码学百科】混合加密与 KEM/DEM 范式:ECIES 与 HPKE 【密码学百科】填充方案:PKCS#1 v1.5、OAEP 与 PSS 【密码学百科】TLS 协议全解析:从握手到 0-RTT 【密码学百科】PKI 与数字证书:信任链的构建与崩塌 【密码学百科】密码认证协议:从 SRP 到 OPAQUE 【密码学百科】零知识证明入门:如何证明你知道而不泄露 【密码学百科】安全信道构造:Noise 协议框架与 Signal 协议 【密码学百科】密钥管理工程:HSM、KMS 与密钥生命周期 【密码学百科】侧信道攻击:从时序攻击到功耗分析 【密码学百科】密码学实现陷阱:三层漏洞分类、审计工具链与系统性预防 密码敏捷性:如何设计可升级的密码系统 【密码学百科】OpenSSL/BoringSSL 架构剖析:ENGINE、Provider 与 FIPS 模块 排序基准测试:用数据说话
【身份与访问控制工程】身份系统迁移与事故响应
Liao Tonglang · 2026-06-22 · via 土法炼钢兴趣小组的算法知识备份

身份系统迁移是 IAM 工程中最特殊的操作——它不像数据库迁移那样有标准的 pg_dump + pg_restore 路径。身份数据(尤其是密码和 MFA 凭据)的不可导出性使得迁移变成数学上的不可逆操作:你可以在数据层面迁移用户记录,但无法把 Keycloak 的 bcrypt 密码哈希转换成 Auth0 的格式并验证,也无法把 Auth0 的 TOTP 种子导入 Keycloak。

本文不仅是迁移方案指南——更是迁移风险的工程控制方法论。

一、为什么身份系统迁移比其他系统迁移难

数据类型 可迁移性 原因
用户档案(email、name、profile) 容易 纯数据,API 导出即可
密码 不可直接迁移 哈希是单向的——且哈希算法和参数(bcrypt rounds、salt 格式)在不同系统间不兼容
TOTP 种子 理论可迁移但通常不导出 种子在 IdP 内部加密存储,没有标准导出 API
WebAuthn / Passkey credential 不可迁移 credential 绑定了 RP ID——换 IdP = 换 RP ID(域名)
OAuth Client 配置 可迁移(手动重建或脚本导入) 纯配置数据
用户-角色关系 可迁移 角色定义可能不同,需要映射
现有 Session / Token 不可迁移 Session 和 Token 由旧 IdP 签发,新 IdP 无法识别

核心结论:身份系统迁移的本质是让用户在有限的中断窗口内重新建立与新 IdP 的信任关系。你迁移的是用户档案和配置,不能迁移的是凭据和会话。

二、密码哈希桥接

密码的迁移是技术难度最高的环节。不能让所有用户重置密码(大量用户流失),不能保存明文密码,也不能简单地复制哈希值。

2.1 方案一:在线桥接(推荐)

用户首次在新 IdP 登录时:

sequenceDiagram
    participant User as 用户
    participant NewIdP as 新 IdP
    participant Bridge as 桥接服务
    participant OldIdP as 旧 IdP

    User->>NewIdP: 1. 登录 (email + password)
    NewIdP->>NewIdP: 2. 查本地——找不到用户哈希
    NewIdP->>Bridge: 3. 请求密码验证
    Bridge->>OldIdP: 4. 用旧 IdP 的 API 或加密通道发送密码
    OldIdP->>Bridge: 5. 验证成功/失败
    alt 验证成功
        Bridge->>NewIdP: 6a. 通知"密码正确"
        NewIdP->>NewIdP: 7a. 使用新哈希算法计算哈希,存入新 IdP
        NewIdP->>User: 8a. 登录成功
    else 验证失败
        Bridge->>NewIdP: 6b. 通知"密码错误"
        NewIdP->>User: 7b. 拒绝登录
    end

关键安全要求: - 桥接服务不能记录明文密码——它只是转发验证请求的代理。 - 验证成功后,桥接服务应立即丢弃密码——用户下次登录时不需要桥接,因为新 IdP 已经有了新格式的哈希。 - 桥接服务和旧 IdP 之间的通信必须通过内部网络或 mTLS。 - 桥接服务的访问日志必须记录每次密码验证请求——这是合规审计的高敏感数据。

2.2 方案二:批量哈希重计算

如果旧 IdP 支持导出哈希值,可以用以下流水线批量迁移:

  1. 从旧 IdP 导出用户 ID + bcrypt hash(base64)。
  2. 在安全隔离的计算环境中,用迁移脚本重新计算——不是”重新哈希”(做不到),而是用相同的哈希格式和参数创建新 IdP 可读的记录。
  3. 在维护窗口中导入新 IdP。

约束:这只在旧 IdP 和新 IdP 使用相同或兼容的哈希算法时才可行。如果旧 IdP 用 bcrypt(\(2a\), rounds=12),新 IdP 用 Argon2id,哈希格式不兼容——无法批量迁移。

2.3 方案三:强制重置(最差选择,但有时必须)

发邮件通知所有用户”系统升级,请重置密码”。这会造成 15-30% 的用户流失(取决于用户基数和邮箱打开率),但有时的确是唯一选择——如从入侵事件中恢复时,不能信任旧系统的密码哈希未被泄露。

三、MFA 的迁移编排

MFA 凭据(TOTP 种子、WebAuthn credential、SMS 电话号码)比密码更难迁移。迁移 MFA 的策略是引导用户重新注册,而不是尝试迁移凭据

编排流程:

  1. 通知阶段:在迁移日期前 2 周发邮件和应用内通知——“请在 X 日后重新设置 MFA”。解释原因(系统升级)。
  2. 宽限期:迁移后的 7 天内,旧 MFA 豁免——用户密码登录后直接进入,不要求 MFA。这一步是为了防止用户因”没收到通知、不会重新设置 MFA”而无法登录。
  3. 进度跟踪:在应用内显式提示”你还没有设置新的 MFA——安全保护降低中,设置只需 2 分钟”。
  4. 强制截止:宽限期(如 14 天)后,未设置 MFA 的用户强制设置——登录后必须先完成 MFA 注册,才能使用应用。
  5. SMS 后备:在整个迁移期间保持 SMS 作为后备第二因素——用户的手机号是从旧系统导出的,不需要用户重新设置。

四、灰度切流与 Session 连续性

4.1 灰度切流

迁移 1000 万用户的认证不能一次性切换——按百分比或按用户群灰度:

第 1 天: 新 IdP 处理 1% 流量(内部团队)
  → 观察: 登录成功率、延迟、错误类型
第 2 天: 10%
第 3 天: 30% (稳定 → 继续)
第 5 天: 100%

切流的手段: - DNS 权重切换:在反向代理(Nginx/Envoy)层按 Cookie 中的用户 ID 哈希做分流。用户 A 的哈希值落在 0-10%,被路由到新 IdP。这保证了同一用户不会因为”每次请求被不同的负载均衡器分配”而有时走新有时走旧。 - 应用层开关:在登录入口判断用户的迁移标记(如 user.migration_phase = 'new'),决定调用旧 IdP 还是新 IdP。

4.2 Session 连续性

迁移期间,已登录用户的 Session 不受影响——Session 有效性由签发它的 IdP 的 Token 有效期决定。

但 Refresh Token Rotation(第 07 篇)在迁移期间会出问题:用户在旧 IdP 有 Refresh Token,但迁移后第一次刷新发现”旧 IdP 不管用了”——因为切流规则已经被路由到新 IdP。

解决方案:在迁移期间的切流层中,Refresh Token 请求始终路由到签发它的 IdP(通过 azp 或 token 内的 issuer 字段推断),而不是按切流权重路由。这需要切流代理理解 OAuth Token 的 issuer 信息。

五、身份安全事故的应急响应

IAM 系统的安全事件有不同于基础设施事故的响应模式。

5.1 事故分类

事故类型 示例 首要响应
令牌/签名密钥泄露 HMAC secret 被公开在 GitHub repo 中 立即密钥轮换,所有现有 token 失效
用户凭据泄露(数据库漏扫) 用户密码哈希 + MFA 种子被外泄 强制所有用户重置密码 + 重新注册 MFA
特权账号滥用 管理员创建后门账号,API 异常调用 禁用特权账号,启动法务审计
身份平台宕机/降级 IdP 不可用,无法登录 启动 break-glass 流程

5.2 Break-Glass 流程

当 IdP 完全不可用时,需要一条”不能从大门进去,就爬窗户”的后备通路:

  1. Break-Glass 账号:预置 3-5 个高度受控的”紧急恢复账号”——密码分段保管(如 Shamir’s Secret Sharing 分配给 5 人,任意 3 人组合可解锁)。
  2. Break-Glass 日志:每次使用紧急账号后,自动触发最高级别的告警,所有安全团队成员收到通知,并要求在 1 小时内完成事后审核。
  3. 降级认证模式:如果 OIDC/OAuth 全面不可用,启动降级模式——本地密码 verify + 管理员人工审批登录(如通过内部 ChatOps 工具)。

工程底线:Break-Glass 流程必须在系统正常时就设计好并测试过。你不能在火灾中设计消防通道。

5.3 事故事后改进清单

每次身份安全事故后的标准复盘清单:

  • 受影响用户数量和时间窗口:哪些用户在什么时间段内暴露?
  • 凭据失效范围:哪些 Token / Session / API Key / MFA 种子需要失效?
  • 攻击路径分析:攻击者是从哪一层(认证/授权/令牌/平台)进来的?
  • 检测延迟:从事件发生到被发现,间隔多久?为什么?
  • 系统加固:防止同类攻击再犯——是配置错误?代码漏洞?社会工程?

六、小结

身份系统迁移和事故响应是 IAM 工程中”检验所有理论”的时刻——你设计的所有令牌机制、MFA 策略、审计日志和备份流程,都要在这个时刻被真实考验。

关键原则: 1. 密码哈希桥接是第一优先级的技术难题——在线桥接是最安全的方案。 2. MFA 迁移通过”宽限期 + 引导 + 强制”的编排完成,不是技术迁移。 3. Session 连续性通过切流代理的 issuer-aware 路由保持。 4. Break-Glass 流程必须在正常时设计、测试、文档化——不能在事故中临时拼凑。


上一篇PAM、IGA 与审计合规

系列结束。返回 IAM 系列首页 查看完整目录。

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-06-14 · architecture / security

【身份与访问控制工程】SCIM 与账号生命周期:开通、变更、离职自动化

SSO 只解决认证,SCIM 解决账号的生命周期管理。但 SCIM 2.0 的实现远不是调几个 REST API 那么简单:User/Group schema 的映射、Delta vs Full sync 的同步策略、Patch 操作语义,每个环节都有坑。本文从账号生命周期的四个关键事件出发,拆解 SCIM 2.0 的核心协议、同步模式、Schema 扩展,以及与企业 IdP(Azure AD、Okta)对接的实际工程经验。

2026-06-13 · architecture / security

【身份与访问控制工程】IAM 全景:为什么这是高价值赛道

从 2020 年 SolarWinds 到 2024 年 Okta 支持系统泄露,身份基础设施的安全失败反复证明一件事:IAM 不是 IT 支撑系统,而是安全架构的承重墙。本文建立现代 IAM 的全景地图——从认证协议、令牌体系、权限模型到身份治理与平台选型,给出 5 个贯穿全系列的核心问题。

2026-06-13 · architecture / security

【身份与访问控制工程】企业单点登录:OIDC 与现代 SSO

OIDC 是当下企业 SSO 的事实标准,但大多数实现只用了它 20% 的规范。本文从 OIDC 核心规范出发,拆解 Authorization Code Flow + PKCE 的完整交互、ID Token 的验证规则、Discovery 与 Dynamic Registration 的互操作性机制,以及 RP-Initiated Logout 和 Session Management 的工程实现细节。

2026-06-13 · architecture / security

【身份与访问控制工程】OAuth 2.1 与 PKCE:现代授权主路径

OAuth 2.1 不是新协议,而是对 OAuth 2.0 的安全加固:废除 Implicit Grant 和 Resource Owner Password Grant,强制 PKCE 用于所有使用授权码模式的客户端,要求精确 redirect_uri 比对。本文从 PKCE 的密码学动机出发,拆解 OAuth 2.1 的授权码流程完整交互、Refresh Token 轮换与发送者约束、DPoP 令牌绑定,以及 DCR (Dynamic Client Registration) 和 RAR (Rich Authorization Requests) 的实际应用。