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 simples e seguras da Tink reduzem os armadilhas com 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 mais informações sobre quais objetivos o Tink foi projetado para cumprir.

A Tink ajuda usuários sem experiência em criptografia a implementar com segurança criptográficas. No Google, a Tink já está disponível em centenas de produtos e sistemas.

Por que usar o Tink?

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

  • É simples de usar

    A criptografia é difícil de acertar. Com o Tink, você pode: criptografar ou assinar dados com as garantias de segurança integradas usando apenas algumas linhas de código. A Tink também pode ajudam a alternar chaves ou a proteger chaves usando sistemas de gerenciamento de chaves externos (KMSs).

  • É seguro

    O Tink adiciona proteções de segurança a bibliotecas conhecidas, como a BoringSSL e a Arquitetura de criptografia Java e as mostra diretamente nas interfaces, para que auditores e ferramentas possam encontrar lacunas rapidamente. A Tink também separa as APIs que são potencialmente perigosos, por isso você pode monitorá-los.

  • É compatível

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

Quem está usando o Tink?

O Tink é amplamente usado por muitas empresas, como Google, Square e Citadel, além de centenas de clientes do Google Cloud e parceiros do Google Pay. Tink também alimenta 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 do Tink em comparação com outras bibliotecas criptográficas? quais são os principais mecanismos que o Tink usa para atingir esses objetivos?

Em resumo, o Tink tem dois objetivos:

  1. Promover a agilidade criptográfica: os usuários devem ser capazes de alterar chaves e algoritmos de maneira simples.
  2. Ativar revisões de segurança: o Tink tem como objetivo permitir que os usuários escrevam códigos com a segurança pode ser revisada localmente, fornecendo interfaces que oferecem garantias de segurança.

Os principais mecanismos que a Tink usa para atingir esses objetivos são os seguintes:

  1. O Tink fornece primitivos e interfaces como abstrações importantes. Esses abstrações permitem que os usuários escrevam códigos que não especificam a algoritmo a ser usado, mas especifica a noção de segurança esperada.
  2. O Tink usa a noção de um "conjunto de chaves", ou seja, um conjunto de chaves associadas a um primitivo específico. Isso faz com que os usuários escrevam códigos que funciona com várias chaves.
  3. No Tink, as chaves não são especificadas apenas pelo material da chave, mas o algoritmo criptográfico e todos os parâmetros. Isso significa que uma chave do Tink sempre seleciona uma função criptográfica exclusiva dentre todas as funções possíveis. funções que podem existir e não deixa espaço para interpretação.

As seções a seguir explicam esses conceitos em mais detalhes.

Agilidade criptográfica

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

Avaliações de segurança e propriedades locais

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

Para ver como isso pode ser usado, imagine que um engenheiro quer armazenar 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;
};

A transmissão de um Aead recebe as seguintes propriedades:

  1. O código comunica que, para IdEncrypter fazer o trabalho, é necessário um com as propriedades de segurança que um Aead fornece. Como alternativa, uma DeterministicAead não seria suficiente. O IdEncrypter exige que duas criptografias do mesmo ID são diferentes. Por outro lado, tendo como parâmetro uma instância de um criptografador GCM AES (uma instância específica de um Aead) seria excessivamente rigoroso: qualquer Aead é suficiente para que o IdEncrypter faça o trabalho, e não precisam ter um algoritmo específico.
  2. Uma análise de segurança pode considerar esse ponto. Um revisor de segurança não precisará 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 todas Os objetos Aead têm, e o revisor pode verificar se eles são suficientes.

Em particular, o segundo ponto requer muito cuidado. Os usuários costumam pedir para adicionar algoritmos que "não são bem" um Aead. O ponto anterior ilustra por que Isso é perigoso: se houver alguma implementação de Aead disponível não fornecer as garantias de segurança necessárias, o IdEncrypter poderá se tornar inseguro, e o engenheiro responsável pela análise de segurança precisa examinar código adicional para verificar se o objeto está instanciado corretamente.