Tink は、オープンソースの暗号ライブラリで、 セキュリティエンジニアですTink の安全でシンプルな API により、 ユーザー中心の設計、慎重な実装とコードレビューを通じて、 大規模なテストを行っています。(このページの目標に関するセクションを参照) Tink が達成を目指していた目標をより詳細に把握できるようになりました。
Tink を使用すると、暗号の知識がないユーザーでも、一般的なセキュリティ インフラストラクチャを安全に実装できます。 タスクを自動化できます。Tink は Google で何百ものプロダクトに導入され、 説明します。
Tink を使用すべき理由は何ですか?
Tink を使用する主な理由は、次のとおりです。
使い方は簡単
暗号化は容易なことではありません。Tink を使用すると、 暗号化または署名する 組み込みのセキュリティ保証をわずか数行のコードで実現できます。Tink は、 外部の鍵管理システムを使用して鍵のローテーションや鍵の保護を行う (KMS)。
安全である
Tink は BoringSSL などのよく知られたライブラリに加えてセキュリティ保護を追加します インターフェースに表示しますが 監査者やツールがギャップをすばやく見つけられるようになります。Tink は、実行している API を 危険性があるため、モニタリングできます。
互換性のある
Tink 暗号テキストは既存の暗号ライブラリと互換性があります。ティンク Google Cloud での鍵の暗号化や保存も Amazon KMS、Google Cloud KMS、Android Keystore、iOS キーチェーンです。
Tink の利用者
Tink は、Google、Square、Citadel などの多くの企業で広く使用されており、 数百社の Google Cloud のお客様と Google Pay パートナーに 提供できますTink も 多くの一般的な Android アプリを保護する Jetpack Security ライブラリを強化 たとえば Slack、adidas、AirBnb、Nextdoor などです
Tink ゴール
他の暗号ライブラリと比較した Tink の主な目的は何ですか。 これらの目標を達成するために Tink が使用する主なメカニズムは何ですか?
要するに、Tink には 2 つの目標があります。
- 暗号のアジリティの向上: ユーザーが鍵を変更し、 構築できます。
- セキュリティ レビューを有効にする: Tink の目的は、ユーザーが次のようなコードを書くことを可能にすることです。 セキュリティをローカルでレビューできます。そのために、 保証します。
この目標を達成するために Tink が使用する主なメカニズムは次のとおりです。
- Tink は、プリミティブとインターフェースを重要な抽象化として提供します。これらの インフラストラクチャを抽象化することで、インフラストラクチャの アルゴリズムを使用する代わりに、想定されるセキュリティの概念を指定します。
- Tink では「キーセット」という概念が使用されています。キーセットとは、 値を返します。その結果 これは複数のキーで動作します
- Tink では、キーは基になるキー マテリアルによって指定されるだけでなく、 暗号化アルゴリズム、すべてのパラメータが含まれます。つまり Tink キーは、常に使用可能なすべての暗号関数から 解釈の余地が残されません。
以降のセクションでは、これらのコンセプトについて詳しく説明します。
暗号化のアジリティ
Google のソフトウェア エンジニアリングについて考えてみてください。 この書籍では、ソフトウェア エンジニアリングの分野で学んだ教訓と、 「教訓」というサブタイトルです。その中で、著者は 物事が変化するという事実が持つ意味合いを説くために、大変な労力を費やしました。この Tink のデザインの多くに影響を与えました。暗号では、データの暗号化が 変化に備える必要があります鍵が漏洩し、アルゴリズムが壊れる。 鍵とアルゴリズムを切り替えられるようにすることは、多くのユーザーにとって非常に重要であり、 慎重に検討してください
セキュリティ審査とローカル プロパティ
Tink は、AEAD インターフェースなどのインターフェースの使用を推奨しており、 データを暗号化できます。その他のセキュリティ保証の 1 つとして、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
では、2 つの暗号鍵で暗号化されたデータが必要です。 異なります。一方、パラメータとして渡す関数のインスタンスを AES GCM 暗号化ツール(Aead
の特定のインスタンス 1 つ)が過剰になります。 厳格:IdEncrypter
には任意の Aead があれば十分ですが、 1 つの特定のアルゴリズムである必要があります - セキュリティ審査ではこの点が考慮されます。セキュリティ審査担当者は
コード リポジトリ全体を調べて
どこかで、誰かが
Aead
のサブクラスを作成しましたが、これは使用が安全ではありませんIdEncrypter
に置き換えます。その代わり、Tink はセキュリティの特性を提供しています。 Aead オブジェクトにはすでに存在しており、審査担当者はこれらで十分かどうかを確認できます。
特に、2 つ目の項目については細心の注意を払う必要があります。ユーザーは頻繁に
「正しくない」アルゴリズムをAead
。前のポイントは、
これは危険です。次の動作をする Aead
の実装を利用できる場合
必要なセキュリティ保証を提供しないと、IdEncrypter
が安全でない可能性があります。
セキュリティレビューを行うエンジニアは
追加のコードを調べる必要があります
オブジェクトが正しくインスタンス化されていることを確認する必要があります。