O que é o Tink?

A Tink é uma biblioteca de criptografia de código aberto escrita por criptógrafos e engenheiros de segurança do Google. As APIs seguras e simples da Tink reduzem as armadilhas comuns com um design centrado no usuário, implementação cuidadosa e revisões de código e testes extensivos. Consulte a seção Metas nesta página para saber mais sobre quais objetivos a Tink foi projetado.

A Tink ajuda usuários que não têm experiência em criptografia a implementar com segurança tarefas criptográficas comuns. No Google, a Tink foi implantada em centenas de produtos e sistemas.

Por que devo usar o Tink?

Os motivos mais importantes para usar o Tink são:

  • É simples de usar

    É difícil acertar a criptografia. Com a Tink, é possível criptografar ou assinar dados com garantias de segurança integradas usando apenas algumas linhas de código. A Tink também pode ajudar a rotacionar chaves ou proteger chaves usando sistemas de gerenciamento de chaves (KMSs) externos.

  • É seguro

    A Tink adiciona proteções de segurança além de bibliotecas conhecidas, como BoringSSL e Java Cryptography Architecture, e as exibe diretamente nas interfaces, para que os auditores e as ferramentas possam encontrar lacunas rapidamente. A Tink também separa as APIs que são potencialmente perigosas para que você possa monitorá-las.

  • É compatível

    Os textos criptografados do Tink são compatíveis com as bibliotecas de criptografia atuais. A Tink também oferece suporte à criptografia ou armazenamento de chaves no Amazon KMS, no Google Cloud KMS, no Android Keystore e no iOS Keychain.

Quem está usando a Tink?

A Tink é amplamente utilizada por muitas empresas, incluindo Google, Square e Citadel, bem como centenas de clientes do Google Cloud e parceiros do Google Pay. A Tink também ativa a biblioteca Jetpack Security, que protege muitos apps Android conhecidos, como Slack, Adidas, AirBnb e Nextdoor.

Objetivos do Tink

Quais são os principais objetivos da Tink em comparação com outras bibliotecas criptográficas e quais são os principais mecanismos que a Tink usa para alcançar esses objetivos?

Resumindo, a Tink tem dois objetivos:

  1. Promover a agilidade criptográfica: os usuários precisam ser capazes de alterar chaves e algoritmos de uma maneira simples.
  2. Ativar revisões de segurança: o objetivo da Tink é permitir que os usuários escrevam códigos que possam ser revisados localmente, fornecendo interfaces que oferecem garantias claras de segurança.

Os principais mecanismos usados pela Tink para atingir essas metas são os seguintes:

  1. O Tink fornece primitivos e interfaces como abstrações importantes. Essas abstrações permitem que os usuários escrevam um código que não especifica o algoritmo exato a ser usado, mas sim a noção de segurança esperada.
  2. O Tink usa a noção de "conjunto de chaves", que é um conjunto de chaves associadas a um primitivo específico. Isso faz os usuários escreverem um código que funciona com várias chaves.
  3. No Tink, as chaves não são especificadas apenas pelo material subjacente, mas também pelo algoritmo criptográfico, bem como por todos os parâmetros. Isso significa que uma chave Tink sempre seleciona uma função criptográfica exclusiva entre todas as funções possíveis que podem existir, sem deixar espaço para interpretação.

As seções abaixo explicam esses conceitos com mais detalhes.

Agilidade criptográfica

Considere o Engenharia de software no Google, um livro sobre lições aprendidas no campo da engenharia de software, com o subtítulo "lições aprendidas com a programação ao longo do tempo". Nela, os autores fazem o máximo para implorar as implicações do fato de que as coisas mudam. Isso também afetou muito o design do Tink. Na criptografia, é importante se preparar para a mudança. As chaves vazam e os algoritmos são corrompidos. A capacidade de alternar chaves e algoritmos é crucial para muitos usuários, e estar preparado é prudente.

Avaliações de segurança e propriedades locais

A Tink promove o uso de interfaces, como a interface AEAD, que permite que os usuários criptografem dados. Entre outras garantias de segurança, um AEAD garante que várias criptografias da mesma string resultem em textos criptografados diferentes.

Para ver como isso pode ser usado, suponha que um engenheiro queira armazenar um código confidencial em um cookie do usuário. Eles podem fornecer uma classe como esta:

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

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

Transmitir um Aead extrai as seguintes propriedades:

  1. O código informa que, para que IdEncrypter faça o trabalho, ele exige um esquema de criptografia com as propriedades de segurança que uma Aead fornece. Como alternativa, um DeterministicAead não seria suficiente. O IdEncrypter exige que duas criptografias do mesmo ID sejam diferentes. Por outro lado, usar como parâmetro uma instância de um criptografador AES GCM (uma instância específica de um Aead) seria muito estrito: qualquer Aead é suficiente para que IdEncrypter faça seu trabalho e não precisa ser um algoritmo específico.
  2. Uma análise de segurança pode levar isso em conta. Um revisor de segurança não precisa passar por todo o repositório de código para verificar se em algum lugar alguém criou uma subclasse de Aead que não é segura para uso com IdEncrypter. Em vez disso, a Tink fornece propriedades de segurança que todos os objetos Aead têm, e o revisor pode verificar se elas são suficientes.

O segundo ponto requer muito cuidado. Os usuários costumam pedir para adicionar algoritmos que "não são exatamente" uma Aead. O ponto anterior ilustra por que isso é perigoso: se houver alguma implementação de Aead disponível que não forneça as garantias de segurança necessárias, a IdEncrypter poderá ficar não segura, e o engenheiro que realiza uma análise de segurança precisará examinar outro código para verificar se o objeto está instanciado corretamente.