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:
- Promover a agilidade criptográfica: os usuários precisam ser capazes de alterar chaves e algoritmos de uma maneira simples.
- 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:
- 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.
- 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.
- 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:
- 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 umaAead
fornece. Como alternativa, umDeterministicAead
não seria suficiente. OIdEncrypter
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 umAead
) seria muito estrito: qualquer Aead é suficiente para queIdEncrypter
faça seu trabalho e não precisa ser um algoritmo específico. - 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 comIdEncrypter
. 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.