ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Sealed Secrets 密码学背景详解:AES-256-GCM 与 RSA-OAEP 混合加密、密钥生命周期及后量子安全考量

Sealed Secrets 密码学背景详解:AES-256-GCM 与 RSA-OAEP 混合加密、密钥生命周期及后量子安全考量 Sealed Secrets 密码学背景详解AES-256-GCM 与 RSA-OAEP 混合加密、密钥生命周期及后量子安全考量【免费下载链接】sealed-secretsA Kubernetes controller and tool for one-way encrypted Secrets项目地址: https://gitcode.com/GitHub_Trending/se/sealed-secretsSealed Secrets 是一个 Kubernetes Controller 与命令行工具用于对 Secret 进行单向加密One-Way Encrypted Secrets明文 Secret 只能在集群内由控制器解密离开集群后只能被加密。本文依据项目官方 Background 章节site/content/docs/latest/background/README.md与其核心子文档 site/content/docs/latest/background/cryptography.md系统讲解 Sealed Secrets 采用的密码学协议、密封Sealing与解封Unsealing的完整数据流程、密钥对的生成与轮换机制并结合仓库源码给出实现级佐证文末则对该方案在量子计算背景下的安全性逐项展开分析。读完本文你将能说清 Sealed Secret 的每一字节从何而来、为何安全以及项目对后量子迁移的官方态度。Background 章节在官方文档中的定位在 Sealed Secrets 文档体系中Background 属于背景概念层它提供的是高层级、大图景的概念解释主要用于帮助你建立对某一特定主题的理解与侧重操作步骤的 How-to guides、记录设计决策的 Reference section 以及逐步上手演练的 Tutorials section 形成互补。该章节的核心内容正是密码学详解——Cryptography即本文的展开对象。协议与密码学工具总览Sealed Secrets 在密钥管理上使用以下协议组合AES-256-GCM配合一个随机生成、单次使用single-use的 32 字节会话密钥session key。由于会话密钥只用一次加密时不使用 noncenonce 全部置零该密钥同时保证明文的机密性confidentiality与完整性integrity。RSA-OAEP搭配 SHA-256用于封装encapsulateAES-256-GCM 会话密钥即标准的密钥封装机制Key Encapsulation Mechanism, KEM保证会话密钥的机密性。X509 证书用于承载和管理 RSA 公钥。证书中携带的公钥可用来加密 AES-256-GCM 会话密钥。关于密钥的生命周期由 Sealed Secrets 控制器生成的证书每 30 天轮换一次有效期为 10 年。这套设计在源码中有着完全对应的实现。加密与解密的核心逻辑集中在 pkg/crypto/crypto.go其中sessionKeyBytes 32pkg/crypto/crypto.go#L16-L18定义了会话密钥长度HybridEncryptpkg/crypto/crypto.go#L36-L73完整实现了随机生成 32 字节会话密钥 →aes.NewCiphercipher.NewGCM构造 AES-GCM →rsa.EncryptOAEP(sha256.New(), ...)封装会话密钥 → 输出格式化密文的全过程HybridDecryptpkg/crypto/crypto.go#L77-L85则是严格对称的逆过程。熵来源Entropy ConsiderationsSealed Secrets 使用的 Go 标准库 API 是crypto/rand其底层熵来源随宿主系统而异Go 官方文档对此有明确描述// On Linux, FreeBSD, Dragonfly and Solaris, Reader uses getrandom(2) if // available, /dev/urandom otherwise. // On OpenBSD and macOS, Reader uses getentropy(2). // On other Unix-like systems, Reader reads from /dev/urandom. // On Windows systems, Reader uses the RtlGenRandom API. // On Wasm, Reader uses the Web Crypto API.这些密码学 API 被公认能提供良好的密码学熵除非种子seed泄露否则不会遭受密码学攻击。crypto/rand.Reader在仓库中贯穿密钥生成与加密全链路例如 pkg/crypto/keys.go#L15-L16 中rsa.GenerateKey(r, keySize)的随机源、pkg/crypto/crypto.go#L38-L40 中会话密钥的io.ReadFull(rnd, sessionKey)以及控制器主流程中传入的rand.Reader见 pkg/controller/main.go#L207。密封Sealing流程逐步拆解公钥/私钥对管理控制器在启动时会查找集群级的公私钥对如果没有找到任何密钥对且没有手动提供控制器会默认生成一个新的4096 位 RSA 密钥对无论哪种情况密钥对都会以普通 Secret的形式持久化保存在与控制器相同的命名空间中公钥若由控制器生成则表现为一张自签名证书应当被公开发布供任何想在集群中使用 Sealed Secrets 的人获取。由控制器生成的密钥对在存储上有着明确的源码约定writeKeypkg/controller/keys.go#L56-L111以v1.SecretTypeTLS类型的 Secret 落盘私钥写入tls.key、证书写入tls.crt并打上sealedsecrets.bitnami.com/sealed-secrets-key: active标签该标签常量SealedSecretsKeyLabel定义于 pkg/controller/keys.go#L21密钥对的生成与注册由KeyRegistry.generateKeypkg/controller/keyregistry.go#L50-L67负责证书生成逻辑在 pkg/crypto/keys.go#L14-L25GeneratePrivateKeyAndCert其证书KeyUsage仅包含x509.KeyUsageEncipherOnlypkg/crypto/keys.go#L47即该证书仅用于加密用途。项目也支持使用你自己的 X509 证书通过kubeseal显式指定证书文件kubeseal --cert [https:/]/path/to/your-cert.pem此外证书在控制器启动时会打印到日志中也可以通过控制器上的 HTTP GET 请求/v1/cert.pem获取。Secret 加密步骤 1明文 Secret 使用AES-256-GCM配合随机生成的单次使用 32 字节会话密钥进行加密。这一步的产物在下文中称为AES encrypted data对应汇总图中的步骤1.。会话密钥加密步骤 2用于加密 Secret 的 AES 会话密钥使用控制器的公钥通过RSA-OAEP SHA256进行封装encapsulation。RSA-OAEP 的额外输入图中称为label内容取决于控制器的 scope作用域配置该算法仅用于加密 AES 会话密钥默认 scope 配置strictlabel Secret 的namespace 与 name 的拼接Namespace-wide scope 配置label Secret 的namespaceCluster-wide scope 配置label空。作用域语义在 API 类型中亦有明确落点SealedSecretClusterWideAnnotationsealedsecrets.bitnami.com/cluster-wide与SealedSecretNamespaceWideAnnotationsealedsecrets.bitnami.com/namespace-wide定义于 pkg/apis/sealedsecrets/v1alpha1/types.go#L21-L25而在 pkg/crypto/crypto.go#L54 中label正是作为rsa.EncryptOAEP的最后一个参数传入的——label的存在使密文与目标 Secret 的身份或其所在命名空间绑定跨作用域复用密文将无法解封。这一步的产物称为RSA encrypted data对应图中的步骤2.。Sealed Secret 存储格式最终的 Sealed Secret 数据格式如下其中||表示拼接运算符size of AES encrypted key (2 bytes) || RSA encrypted data || AES encrypted data即2 字节的大端序 RSA 密文长度 RSA 加密后的会话密钥 AES 加密后的 Secret 数据。源码中前 2 字节通过binary.BigEndian.PutUint16写入 RSA 密文长度pkg/crypto/crypto.go#L61-L63解密时则先读取该长度以正确切分两段密文pkg/crypto/crypto.go#L89-L98。流程汇总图Secret | │ K_s────────────►│ │ │ K_pub───────►│ │ │ │ 1. label───────►│ 2. │ │ │ ┌──────────────────────┬───────▼───────┬──────▼───────┐ Sealed Secret data │size of AES encrypted │ RSA encrypted │ AES encrypted│ │key (2 bytes) │ data │ data │ └──────────────────────┴───────────────┴──────────────┘ K_s 256 bits single-use session key, used by AES-GCM K_pub Public key from the self-signed certificate, used by RSA-OAEP label Additional input for RSA-OAEP encryption. Content differs depending on the scope configuration: * Default config : label Secrets namespace || Secrets name * Namespace-wide : label Secrets namespace * Cluster-wide : label is empty其中K_s是 256 位32 字节单次使用的会话密钥供 AES-GCM 使用K_pub是自签名证书中的公钥供 RSA-OAEP 使用label是 RSA-OAEP 的附加输入内容随 scope 配置变化。解密Unsealing流程解密就是加密的逆过程读取size of AES encrypted key据此正确切分RSA encrypted data与AES encrypted data使用与公钥配对的私钥连同label对RSA encrypted data执行 RSA-OAEP 解密取出 AES 会话密钥用该会话密钥解密AES encrypted data还原出原始 Secret。从源码看pkg/crypto/crypto.go#L77-L85 的HybridDecrypt会遍历KeyRegistry提供的全部私钥以公钥指纹为 map 键逐一尝试singleDecrypt任一私钥成功即返回全部失败则报no key could decrypt secret。这正体现了控制器在密钥轮换期间仍能解封旧密文的能力——旧密钥不会被立即丢弃。密钥轮换30 天轮换与 10 年有效期的实现文档所述证书每 30 天轮换、有效期 10 年在控制器中由initKeyRenewalpkg/controller/main.go#L146-L158与KeyRegistry协作完成控制器启动时若当前最新密钥的创建时间早于截止时间cutoffTime会立即生成新密钥之后按f.KeyRenewPeriod周期性地生成新密钥对见 pkg/controller/main.go#L221 处对initKeyRenewal的调用新生成的密钥通过registerNewKey注册进KeyRegistrypkg/controller/keyregistry.go#L69-L92并以orderingTime为序维护mostRecentKey——新密钥成为当前密钥用于密封新数据而旧密钥仍保留在注册表中用于解封历史数据正是由于KeyRegistry持有多把密钥密钥轮换期间既不影响新密文的产生也不会让存量 SealedSecret 失效这印证了 pkg/crypto/crypto.go#L78 注释中依次尝试所有可能密钥的解密策略。从源码结构看密钥大小KeySize、有效期ValidFor与轮换周期KeyRenewPeriod均为控制器配置项见 pkg/controller/main.go#L39-L42 中ControllerFlags字段默认 4096 位密钥、30 天轮换、10 年有效期即对应这些参数的默认取值。另外pkg/controller/controller.go#L570-L571 的注释及 pkg/controller/controller_test.go#L324-L398 的TestRotateKeepScope测试表明密钥轮换时会校验并保留 SealedSecret 的 scope 配置避免轮换导致作用域语义漂移。后量子密码学Post-Quantum Cryptography考量针对量子计算机可能带来的威胁项目官方文档对方案中的每个密码学组件逐一给出了分析与建议。熵来源即使 QRNG量子随机数发生器在量子语境与非量子语境下都被认为优于 PRNG伪随机数发生器QRNG 依赖量子力学现象且需要物理设备因此不在 Sealed Secrets 的范围内。项目将继续使用crypto/rand作为熵来源。AES-256-GCM分析AES-256-GCM 具有抗量子性。Grover 算法可将密钥暴力破解复杂度从 2²⁵⁶ 降至 2¹²⁸这仍然被视为非常安全不过由于 AES 使用不可变的 128 位分组Grover 算法在某些情况下可能将暴力破解复杂度进一步降至 2⁶⁴。建议AES-256-GCM 的量子安全性不是问题。对于 Sealed Secrets 的实际使用方式而言出现 2⁶⁴ 暴力破解复杂度的情况不太可能即便假定 2⁶⁴ 可能发生今天仍可视为安全但长期来看未必。文档给出的一个低优先级建议是关注能够提供 128 位后量子安全强度的 AES 替代方案例如ChaCha20-Poly1305。SHA-256分析SHA-256 具有抗量子性。Grover 算法可将暴力破解从 2²⁵⁶ 降至 2¹²⁸仍被认为非常安全此外用非量子算法制造哈希碰撞在计算上比用量子计算机更便宜。建议对 SHA-256无需任何变更建议。RSA-OAEP分析RSA-OAEP 与所有 RSA 算法一样不具备抗量子性。Shor 算法可在合理时间内解决 RSA 赖以成立的三个数学难题整数分解问题、离散对数问题与椭圆曲线离散对数问题。因此对于拥有量子计算能力的攻击者而言RSA-OAEP 很容易被破解。建议在可行时替换 RSA这是 Sealed Secrets 后量子安全中优先级最高的建议。文档列出三个严肃的候选替代算法LMS与XMSS基于哈希/lattice 方向以及基于 Goppa 随机码、依赖 Syndrome Decoding ProblemSDP的McEliece基于编码同时也提醒不要忽视 NTRU 等其他算法的研究。此外替换必须满足两项前提业界出现标准或明确推荐的公钥密码算法替代方案存在兼容的开源许可下、可靠的 Go 语言实现。在这些前提具备之前RSA 的替换无法正式承诺cannot be committed upon。小结Sealed Secrets 采用RSA-OAEP 封装会话密钥 AES-256-GCM 加密明文的经典混合加密Hybrid Encryption架构2 字节长度前缀让密文自描述label将密文与 Secret 身份/命名空间绑定从而实现 scope 约束KeyRegistry与定期轮换机制保证密钥的前向演进而无损旧数据解密能力。在量子时代项目评估 AES-256-GCM 与 SHA-256 均可继续使用而 RSA-OAEP 是明确的未来替换重点替换时机取决于业界标准与 Go 生态的成熟度。这套设计既保证了今天 Secret 的机密性与完整性也为长期演进预留了清晰的路线。如需进一步了解如何实际使用这些机制可参阅 How-to guides如密封与校验操作与 Tutorials如安装与快速上手设计决策与开发者细节可在 Reference section 中找到。【免费下载链接】sealed-secretsA Kubernetes controller and tool for one-way encrypted Secrets项目地址: https://gitcode.com/GitHub_Trending/se/sealed-secrets创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表