什么是 Tink?

Tink 是由 Google 的密码学家和安全工程师编写的开源加密库。Tink 安全简单的 API 可以通过以用户为中心的设计、仔细的实现、代码审核以及广泛的测试来减少常见误区。请参阅本页面中的目标部分,详细了解 Tink 旨在实现的目标。

Tink 可帮助无加密背景的用户安全地实现常见的加密任务。在 Google,Tink 已部署到数百种产品和系统中。

为什么要使用 Tink?

使用 Tink 的最重要原因是:

  • 简单易用

    加密技术很难使用。借助 Tink,您只需几行代码即可利用内置的安全保证来加密为数据签名。Tink 还可以帮助您使用外部密钥管理系统 (KMS) 轮替密钥或安全密钥。

  • 安全

    Tink 在 BoringSSL 和 Java 加密架构等知名库的基础上添加了安全保护功能,并直接在接口中显示安全保护,以便审核人员和工具可以快速发现漏洞。Tink 还会将可能存在风险的 API 分隔开,以便您对其进行监控。

  • 它兼容

    Tink 密文与现有加密库兼容。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 有两个目标:

  1. 提升加密敏捷性:用户应该能够通过简单的方式更改密钥和算法。
  2. 启用安全审核:Tink 旨在通过提供提供明确安全保证的界面,让用户能够编写代码,并且代码的安全性可以在本地审核。

Tink 实现这些目标的主要机制如下:

  1. Tink 提供了基元和接口作为重要的抽象概念。这些抽象允许用户编写代码,不指定要使用的确切算法,而是指定预期的安全概念。
  2. Tink 使用“密钥集”的概念,密钥集是与特定基元关联的一组密钥。这会导致用户编写可处理多个密钥的代码。
  3. 在 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 会获得以下属性:

  1. 该代码表明 IdEncrypter 需要具有 Aead 提供的安全属性的加密方案才能正常工作。或者,使用 DeterministicAead 还不够,IdEncrypter 要求同一 ID 的两种加密方式不同。另一方面,将 AES GCM 加密器的实例(Aead 的一个特定实例)作为参数会过于严格:任何 Aead 足以让 IdEncrypter 完成工作,并且不需要是某种特定的算法。
  2. 安全审核会将这一点考虑在内。安全审核人员无需检查整个代码库,即可检查是否有人创建了 Aead 的子类,该类在 IdEncrypter 中使用不安全。相反,Tink 提供所有 Aead 对象都具有的安全属性,并且审核人员可以检查这些属性是否足够。

第二点尤其需要格外小心。用户经常会要求添加“不完全是”Aead 的算法。前面几点说明了这样做为何危险:如果存在任何不提供必要安全保证的 Aead 实现,IdEncrypter 可能会变得不安全,并且执行安全审核的工程师需要检查其他代码,以检查对象是否已正确实例化。