¿Qué es Tink?

Tink es una biblioteca de criptografía de código abierto escrita por criptógrafos y ingenieros de seguridad de Google. Las APIs seguras y sencillas de Tink reducen las conexiones a través del diseño centrado en el usuario, una implementación cuidadosa y revisiones y pruebas exhaustivas. Consulta la sección Objetivos de esta página para ver más información sobre los objetivos que Tink estaba diseñado para cumplir.

Tink ayuda a los usuarios sin un fondo de criptografía a implementar de forma segura criptográficas. En Google, Tink se implementó en cientos de productos y sistemas.

¿Por qué debería usar Tink?

Los motivos más importantes para usar Tink son los siguientes:

  • Es fácil de usar.

    La criptografía es difícil de entender. Con Tink, puedes encriptar o firmar datos con las garantías de seguridad integradas usando unas pocas líneas de código. Tink también puede ayudarte a rotar claves o claves seguras mediante sistemas de administración de claves externos (KMS).

  • Es segura.

    Tink agrega protecciones de seguridad a bibliotecas conocidas como BoringSSL. y Java, y las muestra directamente en las interfaces. para que los auditores y las herramientas pueden encontrar brechas con rapidez. Tink también separa las APIs que son potencialmente peligrosos, por lo que puedes supervisarlos.

  • Es compatible

    Los textos cifrados de Tink son compatibles con las bibliotecas de criptografía existentes. Tink admite la encriptación o el almacenamiento de claves Amazon KMS, Google Cloud KMS, Android Keystore y llavero de iOS.

¿Quién usa Tink?

Tink es muy utilizado por muchas empresas, como Google, Square y Citadel, ya que así como cientos de clientes y socios de Google Pay. Tink también potencia la biblioteca de seguridad de Jetpack, que protege muchas apps populares para Android como Slack, Adidas, AirBnb y Nextdoor.

Objetivos de Tink

¿Cuáles son los objetivos principales de Tink en comparación con otras bibliotecas criptográficas? ¿Cuáles son los principales mecanismos que Tink utiliza para lograr estos objetivos?

En resumen, Tink tiene dos objetivos:

  1. Promover la agilidad criptográfica: Los usuarios deberían poder cambiar las claves y de forma sencilla.
  2. Habilita las revisiones de seguridad: Tink tiene como objetivo permitir que los usuarios escriban código cuyo la seguridad puede revisarse de forma local, ya que proporciona interfaces que brindan garantías de seguridad.

Los principales mecanismos que Tink utiliza para lograr estos objetivos son los siguientes:

  1. Tink proporciona interfaces y primitivas como abstracciones importantes. Estos Las abstracciones permiten que los usuarios escriban código que no especifica la algoritmo que se usará, pero, en su lugar, especifica la noción de seguridad esperada.
  2. Tink usa la noción de un “conjunto de claves”, que es un conjunto de claves que se asociados con un primitivo en particular. Como resultado, los usuarios escriben código que funciona con varias claves.
  3. En Tink, las claves no solo se especifican con el material de clave subyacente, sino que el algoritmo criptográfico y todos los parámetros. Esto significa que una clave Tink siempre selecciona una función criptográfica única de todas las funciones que pueden existir y no deja lugar para la interpretación.

En las siguientes secciones, se explican estos conceptos con más detalle.

Agilidad criptográfica

Considera ingeniería de software en Google, un libro sobre las lecciones aprendidas en el campo de la ingeniería de software, con el subtítulo "lecciones aprendidas de la programación a lo largo del tiempo". En ella, los autores van a grandes para implorar las implicaciones del hecho de que las cosas cambian. Esta también repercutió en gran parte del diseño de Tink. En criptografía, es importante que uno se prepara para el cambio. Se filtrarán las claves y se romperán los algoritmos. Para muchos usuarios, es fundamental poder intercambiar claves y algoritmos. es prudente estar preparado.

Revisiones de seguridad y propiedades locales

Tink promueve el uso de interfaces, como nuestra interfaz AEAD, que permite a los usuarios para encriptar los datos. Entre otras garantías de seguridad, se incluye un AEAD garantiza que las múltiples encriptaciones de la misma cadena dan como resultado diferentes textos cifrados.

Para ver cómo se puede usar esto, supongamos que un ingeniero quiere almacenar información de una cookie del usuario. Podrían proporcionar una clase como la siguiente:

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

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

Cuando se pasa un Aead, se obtienen las siguientes propiedades:

  1. El código comunica que, para que IdEncrypter haga su trabajo, necesita un elemento esquema de encriptación con las propiedades de seguridad que proporciona un Aead. Como alternativa, un DeterministicAead no sería suficiente: el IdEncrypter requiere que dos encriptaciones del mismo ID son diferentes. Por otro lado, tomar como parámetro una instancia de un cifrado AES GCM (una instancia particular de un Aead) sería demasiado Estricto: cualquier Aead es suficiente para que IdEncrypter haga su trabajo, y no necesita ser un algoritmo específico.
  2. Una revisión de seguridad puede tener este punto en cuenta. Un revisor de seguridad no es necesario revisar todo el repositorio de código para verificar en algún lugar, alguien creó una subclase de Aead que no es segura para su uso. con IdEncrypter. En cambio, Tink proporciona propiedades de seguridad que todas Los objetos Aead sí tienen, y el revisor puede comprobar que sean suficientes.

En particular, el segundo punto requiere mucho cuidado. Los usuarios suelen pedir agregar que "no son del todo" un objeto Aead. El punto anterior ilustra por qué Esto es peligroso si hay alguna implementación de Aead disponible que no proporciona las garantías de seguridad necesarias, IdEncrypter puede volverse inseguro y el ingeniero que realiza una revisión de seguridad debe examinar código adicional para verificar que se haya creado la instancia del objeto correctamente.