Tink:用於GCP、安卓和iOS的谷歌加密軟體庫
ofollow,noindex">Tink 是由一些谷歌加密工程師和安全工程師開發的一種多語言的、跨平臺的加密軟體庫,意在幫助開發人員無需成為加密專家就可以正確地實現加密。經過最近兩年的開發,1.2版本中添加了對GCP、安卓和iOS平臺以及C++和Objective-C的支援 。
Tink源自於另一個谷歌的專案 。該專案意在加固加密軟體庫應對偏斜隨機數(biased nonces)、無效曲線(invalid curves)等已知攻擊,並確保DSA、RSA、AES-EAX等廣為使用的加密演算法給出正常的行為。基於該專案的經驗,谷歌工程師著手建立了這個新的軟體庫,目標是提供易於正確使用並難以誤用的安全API。例如,為防止出現可導致加密演算法安全性降低的隨機數重用問題,Tink不允許使用者傳遞隨機數。同時,Tink努力使其提供的每個API都有儘可能明確的安全保證。例如,如果一個特定的操作對選擇密文攻擊(chosen-ciphertext attack) 是安全的,那麼該保證會顯示在介面上,並且實現該操作所用的每個原語都必須滿足同一保證。
Tink當前提供四種ITIVES.md" target="_blank" rel="nofollow,noindex">加密操作 。每種操作都是由特定的原語實現的:
- 對相關聯資料經認證的加密。(原語: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. 生成金鑰。 KeysetHandle keysetHandle = KeysetHandle.generateNew( AeadKeyTemplates.AES256_EAX); // 2. 獲取原語。 Aead aead = AeadFactory.getPrimitive(keysetHandle); // 3. 使用原語。 byte[] plaintext = ...; byte[] additionalData = ...; byte[] ciphertext = aead.encrypt(plaintext, additionalData);
除了加密操作,Tink還提供對密碼管理的支援,包括金鑰版本管理、金鑰旋轉,以及支援遠端金鑰管理系統(KMS,key management system)。當前,Tink支援下列KMS:
- Google Cloud KMS。
- Amazon KMS。
- Android Keystore。
- Apple iOS KeyChain(計劃中)。
Tink當前支援Java、C++和Objective-C。意向於2018年12月釋出的1.3版本 將提供對C#、Go和JavaScript/Node的支援。
儘管Tink並非受谷歌官方支援的產品,但是它已經用於一些谷歌產品,其中包括AdMob、Google Pay、Google Assistant、Firebase和Search API等。
檢視英文原文:Tink is Google Cryptographic Library for the Cloud, Android, and iOS