Tinkは、Googleの暗号技術者とセキュリティエンジニアのグループが開発した、多言語でクロスプラットフォームな暗号ライブラリである。暗号化の専門家でなくても、暗号を正しく実装することが可能になる。2年間の開発期間を経てリリースされたバージョン1.2では、クラウド、Android、iOSプラットフォームと、C++およびObjective-Cのサポートが追加されている。
Tinkは、別のGoogleプロジェクトから、Biased NonceやInvalid Curveなどを使った既知の攻撃に対抗する暗号ライブラリを独立させて、DSAやRSA、AES-EAXなど、一般的な数多くの暗号化アルゴリズムの適切な動作を保証するために生まれたものだ。この経験を基にGoogleのエンジニアたちは、容易に使用できて誤用の少ない、セキュアなAPIを提供することを目的とする、新たなライブラリの開発に取り組んだ。例えば、暗号化アルゴリズムの安全性を損なうナンス(nonce)の再利用を防止するため、Tinkでは、ユーザにナンスを渡すことはできなくなっている。またTinkは、用意した各APIが提供するセキュリティを、可能な限り明確化なものにしようと務めている。例えば、ある操作が選択暗号攻撃(chosen-ciphertext attack)に対して安全ならば、これがインターフェースに表示されると同時に、その実装に使用するプリミティブも同等の保証を満足しなければならない。
Tinkは現在、それぞれのプリミティブを使って実装された、4つの暗号化操作を提供する。
- 関連データを備えた認証付き暗号(プリミティブ: AEAD)
- メッセージ認証コード (プリミティブ: MAC)
- ディジタル署名(プリミティブ: PublicKeySignとPublicKeyVerify)
- ハイブリッド暗号化(プリミティブ: HybridEncryptとHybridDecrypt)
各操作には、関連する最小限のプロパティセットと保証がある。プリミティブは複数の実装を持つことが可能で、ユーザが実際に使用する実装は、応答する型のキーを使用している。例えば、AEADプリミティブを使ってAES-EAXでテキストを暗号化する場合は、このようになる。
import com.google.crypto.tink.Aead;
import com.google.crypto.tink.KeysetHandle;
import com.google.crypto.tink.aead.AeadFactory;
import com.google.crypto.tink.aead.AeadKeyTemplates;
// 1. Generate the key material.
KeysetHandle keysetHandle = KeysetHandle.generateNew(
AeadKeyTemplates.AES256_EAX);
// 2. Get the primitive.
Aead aead = AeadFactory.getPrimitive(keysetHandle);
// 3. Use the primitive.
byte[] plaintext = ...;
byte[] additionalData = ...;
byte[] ciphertext = aead.encrypt(plaintext, additionalData);
In addition to cryptographic operations, Tink provides support for key management, including key versioning, key rotation, and support for remote key management systems (KMS). 現時点では、次のKMSがサポートされている。
- Google Cloud KMS
- Amazon KMS
- Android Keystore
- Apple iOS KeyChain (計画中)
Tinkは現時点でJava、C++、Objective-Cをサポートする他、C#、Go、JavaScript/Nodeが、2018年12月に計画中のバージョン1.3で予定されている。
TinkはGoogleが公式にサポートするプロダクトではないが、AdMobやGoogle Play、Google Assistant、Firebase、Search APIなど、多数のGoogleプロダクトで使用されている。
この記事を評価
- 編集者評
- 編集長アクション