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 は、Slack、Adidas、AirBnb、Nextdoor などの多くの人気 Android アプリを保護する Jetpack セキュリティ ライブラリも支えています。

ティンクゴール

他の暗号ライブラリと比較した Tink の主な目標は何ですか?また、これらの目標を達成するために Tink が使用する主なメカニズムは何ですか?

つまり、Tink には次の 2 つの目標があります。

  1. 暗号のアジリティの向上: ユーザーが鍵とアルゴリズムを簡単に変更できるようにする必要があります。
  2. セキュリティ レビューの有効化: Tink は、セキュリティを明確に保証するインターフェースを提供することで、ユーザーがローカルでセキュリティを確認可能なコードを記述できるようにすることを目的としています。

Tink がこれらの目標を達成するために使用する主なメカニズムは次のとおりです。

  1. Tink は、重要な抽象化としてプリミティブとインターフェースを提供します。これらの抽象化により、ユーザーは、使用するアルゴリズムを正確に指定するのではなく、想定されるセキュリティの概念を指定するコードを記述できます。
  2. Tink は「鍵セット」の概念を使用します。鍵セットとは、特定のプリミティブに関連付けられる鍵のセットです。その結果、ユーザーは複数のキーで動作するコードを記述することになります。
  3. Tink では、鍵は基盤となる鍵マテリアルだけでなく、暗号アルゴリズムとすべてのパラメータによっても指定されます。つまり、Tink 鍵は、存在する可能性のあるすべての関数から一意の暗号関数を常に選択し、解釈の余地がありません。

以降のセクションでは、これらのコンセプトについて詳しく説明します。

暗号のアジリティ

Software Engineering at 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 の 2 つの暗号化が異なる必要があります。一方、AES GCM 暗号化ツールのインスタンス(Aead の 1 つの特定のインスタンス)をパラメータとして受け取ると、厳格が過度に高まります。IdEncrypter がジョブを実行するには任意の Aead で十分であり、特定のアルゴリズムである必要はありません。
  2. セキュリティ審査では、この点を考慮できます。セキュリティ審査担当者は、コード リポジトリ全体を調査して、IdEncrypter での使用に対して安全でない Aead のサブクラスを誰かが作成したかどうかを確認する必要はありません。代わりに Tink は、すべての Aead オブジェクトに含まれるセキュリティ プロパティを提供し、レビュー担当者はこれらが十分かどうかを確認できます。

特に 2 つ目のポイントには細心の注意が必要です。ユーザーから、Aead ではないアルゴリズムの追加が求められることがよくあります。上記の点は、これが危険である理由を示しています。必要なセキュリティが保証されていない Aead の実装が利用可能な場合、IdEncrypter は安全でない可能性があります。セキュリティ レビューを行うエンジニアは、オブジェクトが正しくインスタンス化されていることを確認するために、追加のコードを調べる必要があります。