Tink 是由密码学家和 安全工程师Tink 安全而简单的 API 可减少常见 以用户为中心的设计、仔细的实现和代码审核, 和广泛的测试。请参阅本页中的目标部分,了解 以便更深入地了解 Tink 旨在实现哪些目标。
Tink 可帮助没有加密背景的用户安全地实现通用 加密任务。在 Google,数百款产品中部署了 Tink 和系统。
为什么要使用 Tink?
使用 Tink 的最重要的原因如下:
简单易用
加密很难正确。借助 Tink, 加密或对数据进行签名 内置的安全保障机制,只需几行代码即可。Tink 还可以 帮助您使用外部密钥管理系统轮替密钥或保护密钥 (KMS)
安全可靠
Tink 在 BoringSSL 等知名库的基础上增加了安全保护 Java 加密架构,并直接在接口中显示这些策略, 以便审核人员和工具快速找出不足之处。Tink 还会将 API 都可能存在危险,因此您可以对其进行监控。
兼容
Tink 密文与现有加密库兼容。廷克 还支持加密或存储密钥 Amazon KMS、Google Cloud KMS、Android 密钥库和 iOS 密钥链。
谁在使用 Tink?
Tink 被包括 Google、Square 和 Citadel 在内的许多公司广泛使用, 以及数百个 Google Cloud 客户和 Google Pay 合作伙伴。Tink 还 为 Jetpack Security 库提供支持,该库可为许多热门 Android 应用提供保护 如 Slack、Adidas、AirBnb 和 Nextdoor。
Tink 目标
与其他加密库相比,Tink 的主要目标是什么? Tink 使用哪些主要机制来实现这些目标?
简而言之,Tink 有两个目标:
- 提升加密敏捷性:用户应该能够更改密钥并 算法。
- 启用安全审核:Tink 的目标是允许用户编写 可提供清楚明确、 安全性。
Tink 实现这些目标的主要机制如下:
- Tink 以重要的抽象形式提供基元和接口。这些 抽象允许用户编写 算法,而是指定预期的安全概念。
- Tink 使用“密钥集”的概念, 特定基元的关联。这会导致用户编写代码 它支持多个键
- 在 Tink 中,密钥不仅由底层密钥材料指定, 加密算法以及所有参数。这意味着 Tink 密钥始终会从所有可能的 函数,并且没有解释的空间。
以下部分更详细地介绍了这些概念。
加密敏捷性
不妨考虑 Google 的软件工程。 一本讲述了软件工程领域所学经验的书, 副标题“从编程中学到的教训”。在该视频中,作者在 并竭尽全力地暗示事情会发生变化的意义。这个 而且在很大程度上影响了 Tink 的设计。在加密中 为改变做好准备密钥将会泄露,算法将被破坏。 能够退出按键和算法对于许多用户来说至关重要, 都是谨慎的。
安全审核和本地房源
Tink 提倡使用我们的 AEAD 接口等接口, 来加密数据除了其他安全保证外,AEAD 可以保证对同一字符串进行多次加密时, 密码。
为了解具体使用方法,假设一名工程师想要存储一些敏感的 用户 Cookie 中的 ID。它们可能会提供一个如下所示的类:
class IdEncrypter {
public static IdEncrypter createFromAead(Aead aead);
public String encrypt(long id) throws GeneralSecurityException;
public long decrypt(String encrypted) throws GeneralSecurityException;
};
传递 Aead
会获取以下属性:
- 该代码会告知,
IdEncrypter
需要一个 具有Aead
提供的安全属性的加密架构。 或者DeterministicAead
IdEncrypter
要求对 相同 ID 就有所不同。另一方面,将 AES GCM 加密器(Aead
的一个特定实例)会过于 严格:任何 Aead 都足以让IdEncrypter
完成其工作, 需要是一种特定的算法。 - 安全审核会将这一点考虑在内。安全审核人员执行的是
而不必检查整个代码库
在某个位置,有人创建了
Aead
的子类,这种做法不安全 和IdEncrypter
。相反,Tink 提供的安全属性 Aead 对象已指定,并且审查人员可以检查这些对象是否足够。
具体而言,第二点需要非常谨慎。用户经常请求添加
“不太符合”Aead
。上一点说明了
这种做法比较危险:如果存在任何可用的 Aead
实现,
没有提供必要的安全保证,IdEncrypter
可能会变得不安全,
执行安全审核的工程师需要检查其他代码
检查对象是否已正确实例化。