Google Tink:安全的高级密码学
使用 Tink 基于密钥集的 API 执行常见密码学操作,无需具备密码学专业知识。
Google Tink:安全的高级密码学 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
Tink 概述与动机
Tink 是由 Google 密码学团队开发的开源密码学库,旨在提供安全且易于使用的密码学功能。其主要动机是防止常见的密码学误用模式,即使是经验丰富的开发人员在使用低级库时也可能犯下这些错误。Tink 的接口经过设计,使正确的操作成为最省力的路径,从而难以意外创建不安全的配置。
基于密钥集的抽象
Tink 将密钥组织为密钥集,而不是公开单个密钥对象。应用程序使用密钥集句柄,而不是原始密钥字节。该抽象可以防止密钥意外暴露,实现无缝密钥轮换,并允许将密钥存储在远程密钥管理系统中,而应用程序始终无需直接接触密钥材料。密钥集概念是 Tink 安全设计的核心。
AEAD 接口
Tink 中的 AEAD(带关联数据的认证加密)接口提供加密和解密操作。AeadFactory.getPrimitive(keyset) 会返回一个 Aead 对象;调用 aead.encrypt(plaintext, associatedData) 会返回密文。Tink 会根据密钥集自动选择加密算法(例如 AES-256-GCM)并生成随机数。该接口隐藏了所有算法细节、随机数管理和格式编码。
MAC 接口
Tink 的 MAC 接口提供用于消息验证码的计算和验证操作。MacFactory.getPrimitive(keyset) 返回一个 Mac 对象。mac.computeMac(data) 返回身份验证标签;mac.verifyMac(tag, data) 对其进行验证,如果验证失败则抛出安全异常。默认算法是 HMAC-SHA256。该接口可防止常见错误,例如使用普通字符串相等比较 MAC,而不是使用恒定时间比较。
数字签名接口
Tink 为数字签名提供独立的 PublicKeySign 和 PublicKeyVerify 接口。签名对象和验证对象分别从不同的密钥集句柄(私钥和公钥)派生而来,可以防止误将私钥用于验证,或反过来误用公钥。Tink 默认使用 Ed25519 和 ECDSA P-256 实现,并提供确定性 ECDSA,以避免随机性漏洞。
混合加密接口
Tink 的 HybridEncrypt 和 HybridDecrypt 接口实现 ECIES(椭圆曲线集成加密方案)。混合加密将非对称密钥交换与对称加密结合起来:发送方生成临时密钥,使用接收方的公钥执行 ECDH,派生对称密钥,然后使用 AEAD 进行加密。这样便可以使用非对称密钥加密大型消息,而不必承担纯非对称加密的开销。
密钥集轮换流程
Tink 中的密钥轮换是安全且向后兼容的。轮换步骤如下:生成新密钥并将其添加到密钥集中,将新密钥标记为主密钥(未来的加密操作会使用它),同时保留密钥集中的旧密钥以解密现有密文。由于非主密钥仍可用于解密,旧密文仍能继续解密。所有旧密文都已重新加密或过期后,再从密钥集中删除旧密钥。
密钥集序列化
Tink 密钥集会序列化为 JSON 或二进制 Protocol Buffer 格式。JSON 格式便于人类阅读,适合调试。二进制格式更紧凑,适合生产环境。包含私钥的序列化密钥集在存储前必须加密。Tink 支持使用标准对称 AEAD 加密来存储加密的密钥集,也支持将存储委托给 KMS。
用于密钥集加密的 KMS 集成
Tink 可与主要的 KMS 提供商集成:AWS KMS、Google Cloud KMS 和 HashiCorp Vault。Tink 不使用本地 AEAD 密钥来加密密钥集,而是使用 KMS 包装密钥集加密密钥。实际的密钥集加密使用本地生成的数据加密密钥(DEK),而 DEK 由 KMS 密钥加密密钥(KEK)加密。这遵循云提供商所使用的信封加密模式。
用于大型文件的流式 AEAD
标准 AEAD 在加密和解密时要求将整条消息加载到内存中。Tink 的流式 AEAD 接口会将大型文件分成多个分段进行加密,无需缓存完整明文即可执行流式加密和解密。每个分段都会独立进行身份验证,并且解密过程中会验证分段的顺序和完整性。这对于加密备份、视频和其他大型文件至关重要。
语言支持和生态系统
Tink 支持 Java、Python、Go 和 C++,并为每种语言提供符合其习惯的 API。跨语言互操作性得到保证:使用 Python 中的 Tink 加密的文件,可以使用 Java 中的 Tink 解密。这使 Tink 适合由多种语言编写的多个服务组成、且需要交换加密数据的系统。Tink 还与 Protocol Buffers 集成,以实现类型安全的密钥集配置。
Tink 密钥集轮换
在 Tink 密钥轮换期间,使用旧的(非主)密钥加密的密文会发生什么?
Google Tink 复习
Tink 总结:基于密钥集的抽象可防止原始密钥暴露,AEAD 接口会隐藏随机数管理和算法选择,MAC 接口在内部使用恒定时间验证,数字签名和混合加密接口可防止接口误用,密钥轮换具有向后兼容性(旧密钥在被移除前仍可解密),KMS 集成遵循信封加密模式,流式 AEAD 可处理大型文件,并保证跨语言互操作性。
常见问题解答
「Google Tink:安全的高级密码学」课时是免费的吗?
是的 — 「Google Tink:安全的高级密码学」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「Google Tink:安全的高级密码学」这节课中我会学到什么?
使用 Tink 基于密钥集的 API 执行常见密码学操作,无需具备密码学专业知识。 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「Google Tink:安全的高级密码学」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- libsodium:防误用密码学库
- OpenSSL API:核心结构与常见陷阱
- Google Tink:安全的高级密码学
- 审计与选择密码学依赖