Che cos'è Tink?

Tink è una libreria di crittografia open source scritta da crittografi e ingegneri della sicurezza di Google. Le API semplici e sicure di Tink riducono gli insidie comuni grazie alla progettazione basata sull'utente, un'attenta implementazione, revisioni del codice e test approfonditi. Consulta la sezione Obiettivi in questa pagina per ulteriori informazioni sugli obiettivi per cui Tink è stato progettato.

Tink aiuta gli utenti senza un background di crittografia a implementare in modo sicuro attività di crittografia comuni. In Google, Tink è stato implementato in centinaia di prodotti e sistemi.

Perché dovrei usare Tink?

I motivi più importanti per utilizzare Tink sono:

  • È facile da usare

    La crittografia è difficile da usare correttamente. Con Tink, puoi criptare o firmare i dati con garanzie di sicurezza integrate utilizzando poche righe di codice. Tink può anche aiutarti a ruotare o proteggere le chiavi utilizzando sistemi di gestione delle chiavi (KMS) esterni.

  • È sicuro

    Tink aggiunge protezioni di sicurezza a librerie note come BoringSSL e Java Cryptography Architecture e le mostra direttamente nelle interfacce, in modo che revisori e strumenti possano trovare rapidamente eventuali lacune. Tink separa inoltre le API potenzialmente pericolose, consentendoti di monitorarle.

  • È compatibile

    I testi cifrari Tink sono compatibili con le librerie di crittografia esistenti. Tink supporta anche la crittografia o l'archiviazione delle chiavi in Amazon KMS, Google Cloud KMS, archivio chiavi Android e Portachiavi iOS.

Chi sta usando Tink?

Tink è ampiamente utilizzato da molte aziende, tra cui Google, Square e Citadel, nonché da centinaia di clienti Google Cloud e partner Google Pay. Tink è alla base anche della libreria Jetpack Security, che protegge molte app Android popolari come Slack, Adidas, AirBnb e Nextdoor.

Tink goal

Quali sono gli obiettivi principali di Tink rispetto ad altre librerie crittografiche e quali sono i principali meccanismi che utilizza Tink per raggiungerli?

In breve, Tink ha due obiettivi:

  1. Promuovi l'agilità crittografica: gli utenti devono essere in grado di modificare chiavi e algoritmi in modo semplice.
  2. Abilitare i controlli della sicurezza: Tink mira a consentire agli utenti di scrivere codice la cui sicurezza può essere esaminata localmente, fornendo interfacce che forniscono garanzie di sicurezza chiare.

I principali meccanismi utilizzati da Tink per raggiungere questi obiettivi sono i seguenti:

  1. Tink fornisce primitive e interfacce come importanti astrazioni. Queste astrazioni consentono agli utenti di scrivere codice che non specifica l'algoritmo esatto da utilizzare, ma specifica il concetto di sicurezza previsto.
  2. Tink usa la nozione di "set di chiavi", ovvero un insieme di chiavi associate a una particolare primitiva. In questo modo gli utenti scrivono codice che funziona con più chiavi.
  3. In Tink, le chiavi non vengono specificate solo dal materiale della chiave sottostante, ma anche dall'algoritmo crittografico e da tutti i parametri. Ciò significa che una chiave Tink seleziona sempre una funzione crittografica unica tra tutte le possibili funzioni possibili, senza lasciare spazio all'interpretazione.

Le sezioni seguenti spiegano questi concetti in modo più dettagliato.

Agilità crittografica

Prendiamo in considerazione Software Engineering at Google, un libro sulle lezioni apprese nel campo dell'ingegneria del software, dal titolo "lezioni apprese dalla programmazione nel tempo". Qui gli autori fanno di tutto per implorare le implicazioni del fatto che le cose cambino. Questo fatto ha influito anche su gran parte del design di Tink. In crittografia, è importante prepararsi al cambiamento. Le chiavi perderanno e gli algoritmi si romperanno. La possibilità di scambiare chiavi e algoritmi è fondamentale per molti utenti ed è prudente essere preparati.

Revisioni di sicurezza e proprietà locali

Tink promuove l'uso di interfacce, come la nostra interfaccia AEAD, che consente agli utenti di criptare i dati. Tra le altre garanzie di sicurezza, un AEAD garantisce che più crittografie della stessa stringa generino testi criptati diversi.

Per capire come utilizzare questa funzionalità, supponiamo che un ingegnere voglia memorizzare un ID sensibile in un cookie dell'utente. Potrebbe fornire un corso simile al seguente:

class IdEncrypter {
  public static IdEncrypter createFromAead(Aead aead);

  public String encrypt(long id) throws GeneralSecurityException;
  public long decrypt(String encrypted) throws GeneralSecurityException;
};

Passando un Aead si ottengono le seguenti proprietà:

  1. Il codice comunica che, per consentire a IdEncrypter di svolgere il suo lavoro, richiede uno schema di crittografia con le proprietà di sicurezza fornite da Aead. In alternativa, DeterministicAead non sarebbe sufficiente: IdEncrypter richiede che due crittografia con lo stesso ID siano diverse. D'altra parte, prendere come parametro un'istanza di un criptatore AES GCM (una particolare istanza di Aead) sarebbe eccessivamente rigoroso: qualsiasi Aead è sufficiente per far svolgere il suo lavoro IdEncrypter e non deve essere un algoritmo specifico.
  2. Un controllo di sicurezza può prendere in considerazione questo punto. Un revisore della sicurezza non deve esaminare l'intero repository di codice per verificare se da qualche parte è stata creata una sottoclasse Aead non sicura per l'utilizzo con IdEncrypter. Tink fornisce invece proprietà di sicurezza di cui dispongono tutti gli oggetti Aead e il revisore può verificare che siano sufficienti.

Nello specifico il secondo punto richiede molta attenzione. Gli utenti spesso chiedono di aggiungere algoritmi "non esattamente" di tipo Aead. Il punto precedente illustra il motivo per cui ciò è pericoloso: se è disponibile un'implementazione di Aead che non fornisce le garanzie di sicurezza richieste, IdEncrypter può diventare non sicuro e il tecnico che esegue un controllo della sicurezza deve esaminare codice aggiuntivo per verificare che l'istanza dell'oggetto sia corretta.