# Tink
Tink は、暗号を専門としない技術者でも安全に利用できることを目指して Google が開発した暗号ライブラリである。多くの Google 製品チームのセキュリティレビューを通じて発見された暗号実装の脆弱性の経験から生まれ、現在は Google 内部および外部との通信でデータを保護するための推奨ライブラリになっている。*Building Secure and Reliable Systems* 第6章は、暗号プリミティブが非専門家には気づきにくい破局的な失敗モードを持つ例として、認証を伴わない(あるいは誤って組み合わせた)暗号化が「復号オラクル」として悪用されうることを挙げ、Tink をこうした落とし穴を減らす安全なAPI設計の実例として提示する。(Source: [[@2020__OReilly__Building Secure and Reliable Systems - Chapter 6 Design for Understandability]] ch.6 §Software Design > Considering API Usability > Example: Secure cryptographic APIs and the Tink crypto framework)
第6章は Tink の設計指針を6つ挙げる。**Secure by default**(Galois Counter Modeのnonce再利用を許さないなど誤用しにくいAPI設計。Project Wycheproof由来の実績あるライブラリを再利用する)、**Usability**(ブロック・ストリーミングのAEADプリミティブなど所望の機能に集中できる単純なAPI)、**Readability and auditability**(機能がコード上で明確に読み取れ、採用する暗号方式をTinkが管理する)、**Extensibility**(鍵管理者のレジストリなどを通じ新しい機能・方式・フォーマットを追加しやすい)、**Agility**(鍵ローテーションを組み込み、廃止された方式の非推奨化に対応)、**Interoperability**(多数の言語・プラットフォームで利用可能)である。Tink は Cloud KMS・AWS KMS・Android Keystore と統合した鍵管理も提供し、APIが生の鍵材料を直接受け取らずKMSの利用を促すことで、鍵材料をディスクやソースコードに残す危険な慣行を避けやすくしている。(Source: [[@2020__OReilly__Building Secure and Reliable Systems - Chapter 6 Design for Understandability]] ch.6 §Software Design > Considering API Usability > Example: Secure cryptographic APIs and the Tink crypto framework)
ただし第6章は、Tink が低レベルの暗号実装ミスは防げても、クレジットカード番号や社会保障番号のように値域の小さいデータをハッシュだけで保護するといった、Tink API自体より上位の設計ミスまでは防げないと明言する。あるアプリケーションがTinkを使っているという事実だけから、そのアプリケーションに暗号関連の欠陥がないと結論することはできず、開発者・レビュアーはライブラリが実際に保証する性質と保証しない性質を正確に理解する必要がある。(Source: [[@2020__OReilly__Building Secure and Reliable Systems - Chapter 6 Design for Understandability]] ch.6 §Software Design > Considering API Usability > Example: Secure cryptographic APIs and the Tink crypto framework)